2010-12-01 146 views
9

我在使用jQuery元素时遇到了麻烦。我正在构建一个var的名称,例如:Jquery - 通过id获取元素构造字符串中的id

var myId = "#" + myGotId; 

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

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

由OP在评论提供@Pointy —额外的代码编辑:

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", ""); 
    } 
+2

应该是的。检查myId的值是你期望的。 – Quentin 2010-12-01 14:25:13

+0

`myGotId`的价值是什么?你确定你不是指`“#”+“myGotId”吗?如果具有该ID的元素不存在,那么既不动态加入字符串也不会帮助您。 – darioo 2010-12-01 14:29:43

+0

David是正确的,请检查myGotId的值以确保它将myId设置为适当的值。这是你的代码的一个工作例子。 http://www.jsfiddle.net/subhaze/kjpNN/ – subhaze 2010-12-01 14:29:56

回答

18

我不知道到底发生了什么,因为你还没有公布太多的代码,但要确保你的JavaScript代码运行元素与你的目标“标识“价值已包含在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

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

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

它不起作用。也许名称中的特殊字符正在影响: var g = indexNodeSelected; g = g.replace(“\\”,“\\\\\\\”); $(“#”+ g).attr(“title”,“changed”); 这是我的元素的ID,并与四个“\\\\”它的工作原理: //$("#WindowsAdapter-8CD2DEB979A0188\\\TextBox-8CD2DEB9E5CECC4").attr("title“,”changed“ ); – 2010-12-01 14:28:59

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> 
2

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

把你的jQuery代码放在文档就绪函数中,它会工作。

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

示例网页=>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选择器返回预期结果

为什么?

脚本可以在浏览器有机会解析页面上的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)); 
});