Jquery - 通过id在string中构造id来获取元素

时间:2010-12-01 14:20:26

标签: javascript jquery

我在使用带有jquery的元素时遇到了麻烦。我在var中构造名称,如:

var myId = "#" + myGotId;

$(myId).attr("title", "changed");

$(myId)返回空。我希望通过id获取我的元素,但是构建我的Id动态地连接字符串。

由@Pointy编辑 - OP在评论中提供的其他代码:

var form = $('form#formDefaultValue');
$(':submit', form).click(function(event) {
  event.preventDefault();
  $.post(form.attr('action'), form.serialize(), function(data, status, XMLHttpRequest) {
    if (status == 'success') {
      $("#msgInformation").html("Your changes have been successfully saved.");
      jQuery("#spanDefaultValue").attr("class", "db");
      var g = indexNodeSelected;
      g = g.replace("\\", "\\\\\\\\");
      $('#'+ g).find("span").attr("class", "");
   } 

4 个答案:

答案 0 :(得分:21)

我不确切知道发生了什么,因为您没有发布太多代码,但确保您的Javascript代码在之后运行目标“id”值的元素已包含在DOM。如果你有这个:

<html>
  <head>
    <script>
      var myId = '#' + myGotId;
      $(myId).whatever();

然后这将无效,因为代码运行时将不会看到实际的页面。

相反,试试这个:

  <script>
    $(function() {
      var myId = '#' + myGotId;
      // ...
    });

确保您的“myGotId”字符串正是您期望的值(即,编码到目标元素的“id”属性中的值)也很重要。

编辑如果您认为自己正在构建“id”,那么您可以尝试将其作为替代方案:

$(document.getElementById(myGotId)).whatever()

换句话说,只需传递给$()函数,就可以将一个普通的DOM元素“包装”在jQuery对象中。如果这样做,那么问题可能是你的“id”值在某种程度上混淆了选择器引擎。 “id”值是否包含“。”什么机会?

答案 1 :(得分:2)

你需要额外的变量吗?试试没有它,像这样:

$("#" + myGotId).attr("title", "changed");  

答案 2 :(得分:2)

你的jQuery没有按预期工作的原因是因为它在DOM完全加载到浏览器之前执行。

将您的jQuery代码放入文档就绪函数中,它将起作用。

$(document).ready(function () {
  // code that will run once the entire DOM is loaded into the browser
});

示例网页=&gt; http://mikegrace.s3.amazonaws.com/forums/stack-overflow/example-get-element-by-constructed-string.html

示例Firebug控制台输出

Example Firebug console output

这里发生了什么?

  1. 一旦脚本加载就开始执行
  2. console.log输出'Dom可能还没准备好'
  3. jQuery选择器没有返回任何内容
  4. DOM完全加载到浏览器中,启动文档就绪功能
  5. jQuery选择器返回了预期结果
  6. 为什么?

    在浏览器有机会解析页面上的HTML之前,可以加载脚本。在浏览器完全解析DOM并构建它的DOM树之前,它将无法告诉您元素是否存在。这就是为什么在文档准备好之前运行jQuery选择器通常会导致意外结果的原因。

    示例脚本

    //run possibly before DOM is loaded into browser
    var selector = "#crazy-image";
    console.log("DOM may not be ready yet");
    console.log($(selector));
    $(document).ready(function () {
      // code that will run once the entire DOM is loaded into the browser
      console.log("DOM ready");
      console.log($(selector));
    });
    

答案 3 :(得分:0)

正如此示例所示,您的代码应该正常工作: 确保在创建要获取的元素后执行脚本。 确保ID正确无误。

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.4.4.js"></script>
</head>
<body>

<div id="mydiv">Hello</div>

<script>
var myGotId = 'mydiv';
var myId = "#" + myGotId;
$(myId).attr("title", "changed");
</script>

</body>
</html>