jquery中每个循环中$(this)和$(“#id”)之间的差异

时间:2013-08-02 10:12:17

标签: javascript jquery jquery-selectors

我是jquery的新手。我知道这个问题很愚蠢,但我在这里错过了一些概念。 这是问题所在:

$("input.integers").each(function(index) {

    console.log("----");
    console.log($(this).attr('id') + " " + $(this).val()); 
    console.log($(this).attr('id') + " " + $("#"+$(this).attr('id')).val());
    // the next log is here just to show a direct selection. I'm concerned about the two logs above this one 
    console.log($("#myId").attr('id'), $("#myId").val());

    that.setModelData($(this).attr('id'), $(this).val());
});

这是输出:

PhantomJS 1.6 (Linux) LOG: '----'
PhantomJS 1.6 (Linux): Executed 61 of 90
PhantomJS 1.6 (Linux) LOG: 'myId '
PhantomJS 1.6 (Linux): Executed 61 of 90
PhantomJS 1.6 (Linux) LOG: 'myId 123'
PhantomJS 1.6 (Linux): Executed 61 of 90
PhantomJS 1.6 (Linux) LOG: [ 'myId', '123' ]

输入标签。为什么$(this).val()为空且$("#"+$(this).attr('id')).val()包含正确的值?

更新:

业力测试:

it('the model must be updated', function(){

    $("#myId").val("123");  

    $("#save-process").click();
    server.respond();

    expect(fdtView.model.get('myId')).toBe("123");

});

夹具:

<input id="myId" name="myId"
    class="integers" type="text" /> 

2 个答案:

答案 0 :(得分:0)

在循环中,与$(“input.integers”)选择器匹配。所以,jquery在内存中有这个选择器。 $(“#myId”)是一个唯一的选择器,对于每个循环,jquery搜索此元素并对其进行分析。这两个元素是相同的巧合,因为你的HTML代码是:

<input class="integers" id="myId" />

但是,如果你输入的CSS类很多,那么这个会有所不同。

多输入的示例。

HTML code:

<input class="integers" value="toto"/>
<input class="integers" value="titi"/>
<input class="integers" value="tata"/>
<input class="integers" value="tutu"/>

JS代码:

$("input.integers").each(function(index) {
console.log("Value = "+$(this).val);
}

控制台日志:

Value = toto
Value = titi
Value = tata
Value = tutu

所以要回答你的问题,如果this.val()$("#"+$(this).attr('id')).val())不同,那么加载它的选择器就不好了。

答案 1 :(得分:0)

好的,我不得不说这是业力问题而不是jquery。

我们正在使用Backbone.js,视图正在视图的定义中加载模板:

template : _.template($("#mytemplate").html()),

当加载测试时,如果它没有找到固定装置,将会出现异常,因此我们在启动时添加了一个名为fixtures.js的文件:

loadFixtures('viewtemplate.html','mytemplate.html');

(@ Blame)有人在茉莉花测试套件beforeEach中添加了此代码:

beforeEach( function() {
    loadFixtures('currentStepContainerFixture.html', 'mytemplate.html');

所以灯具加载两次

当我在我的代码中使用时:

 console.log($(this).attr('id') + " " + $(this).val()); 
 console.log($(this).attr('id') + " " + $("#"+$(this).attr('id')).val());

基本上第一个日志是关于当前元素的,而第二个日志是关于具有该id的第一个输入。

这就是为什么我们有这种暴力行为。我不得不说,为了存在两个具有相同id的元素而引发某种异常,会有所帮助

PhantomJS 1.6 (Linux): Executed 61 of 90
PhantomJS 1.6 (Linux) LOG: 'myId ' --> current $(this)
PhantomJS 1.6 (Linux): Executed 61 of 90
PhantomJS 1.6 (Linux) LOG: 'myId 123' --> first occurrence of "#myId"

我不配这四点,问题出在显示器和键盘之间。对不起:(