Javascript Jquery textarea.val()意外返回未定义
以下代码已经运行了几个星期,当我在jquery中使用选择器获取textarea的值时,偶尔会返回“undefined”,如下所示: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
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());