Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jquery textarea.val()意外返回未定义_Javascript_Jquery_Html_Undefined - Fatal编程技术网

Javascript Jquery textarea.val()意外返回未定义

Javascript Jquery textarea.val()意外返回未定义,javascript,jquery,html,undefined,Javascript,Jquery,Html,Undefined,以下代码已经运行了几个星期,当我在jquery中使用选择器获取textarea的值时,偶尔会返回“undefined”,如下所示: var text = escape($(this).find('textarea[id*=txtText]').val()); 此控件由以下内容在HTML中适当定义: <asp:TextBox ID="txtText" runat="server" MaxLength="150" alt="150" TextMode="MultiLine" Row

以下代码已经运行了几个星期,当我在jquery中使用选择器获取textarea的值时,偶尔会返回“undefined”,如下所示:

var text = escape($(this).find('textarea[id*=txtText]').val());
此控件由以下内容在HTML中适当定义:

<asp:TextBox ID="txtText" runat="server" MaxLength="150" alt="150" TextMode="MultiLine"
     Rows="5" Columns="50" CssClass="customCss" ClientIDMode="Static" />
但这也开始返回未定义,这就是为什么我将其更改为前面的示例。我搞不懂为什么有些实例可以这样做,而有些则不行。作为一个多行文本框,jquery是否会因为任何原因将其声明为未定义

<br/>   

文本区域中包含的字符


如果您有任何帮助或建议,我们将不胜感激。

问题在于您正在执行一个
runat=“server”
,这会使服务器更改ID。此新ID的示例可能类似于
MainContent\u txtText
,您可以通过右键单击文本框并单击
Inspect
检查元素来确定服务器正在将ID更改为什么

Chrome内置了开发者工具,允许您进行检查。如果您不使用Chrome,Firefox也有一个检查器,或者您可以下载并使用Firebug

你可以做一些事情来绕过这个

解决方案1 使用第一段中的Inspector方法确定新生成的ID,并以与代码示例类似的方式通过该ID访问它:

var text = escape($("#insert_id_from_inspector_here").val());
解决方案2 为控件指定一个类,并从该类元素获取值:

var text = escape($(".txtText").val());
解决方案3 您还可以将ID动态打印到javascript代码中:

var text = escape($("#<%= txtText.ClientID %>").val());
var text=escape($(“#”)val();

这可能是因为您在asp:TextBox上指定了静态的ClientMode

<asp:TextBox ID="txtText" runat="server" MaxLength="150" alt="150" TextMode="MultiLine"
 Rows="5" Columns="50" CssClass="customCss" **ClientIDMode="Static"** />

静态ClientID值设置为ID属性的值。如果 控件是一个命名容器,该控件用作 它包含的任何控件的命名容器的层次结构


使用Chrome开发工具查看DOM中的id

您可以做的一件事是

var text = escape($(this).find('textarea[id*=<%=txtText.ClientID%>]').val());
var text=escape($(this.find('textarea[id*=]).val());

性能差异可以忽略不计,即使我通常只是做一个查看源代码,发现w/e asp.net正在调用它并使用它。然而,就我所知,上述方法很简单。

什么是
$(这)
?为什么它是一个
asp:TextBox
?这样的节点不会被jQuery识别为
textarea
,escape函数对字符串进行编码。它是一个内置的javascript函数。可以在这里找到详细信息。当代码运行时,DOM是否保证完全加载?如果textarea还不存在,val()将返回undefined.Yes。它保证在运行时满载。执行此代码时,页面上的所有内容都将被加载,用户将已经执行了多个操作。设置一个调试器语句并找出发生了什么。它找到元素了吗?到目前为止,这个方法是有效的,但我仍然想要一个进一步的答案。有人告诉我,将ClientIDMode设置为static仍然可以让这个文本框在jquery中通过它的ID进行标识,这对我来说通常是可行的。这不适用于我使用的选择器类型吗?如果ClientIDMode设置为static,它将是静态的,但这并不意味着它不会在容器名称前加前缀-它只是意味着它不会在每次运行时更改。@dave,OP有转义函数,所以我在回答中保留了它。@sebe,我添加了另一个选项,将ClientID打印到javascript代码中。这不需要静态ClientMode,但这意味着您必须在当前调用ID的任何位置使用asp语句。@sebe我的第一条评论是否回答了您关于ClientMode的问题?
var text = escape($(this).find('textarea[id*=<%=txtText.ClientID%>]').val());