2012-12-21 97 views
7

好吧,我已經盡力搜索,但是。 我有一個任務,我需要使用Ajax加載一些js等等。長話短說,我卡住了。點擊獲取jquery數組元素的索引

首先在一個的script.js代碼(我必須加載和我不能修改):

var divs = [ 
    '<div class="item">Lorem ipsum 0</div>', 
    '<div class="item">Lorem ipsum 1</div>', 
    '<div class="item">Lorem ipsum 2</div>', 
    '<div class="item">Lorem ipsum 3</div>', 
    '<div class="item">Lorem ipsum 4</div>', 
    '<div class="item">Lorem ipsum 5</div>', 
    '<div class="item">Lorem ipsum 6</div>', 
    '<div class="item">Lorem ipsum 7</div>' 
]; 
delete(divs[3]); 

然後我的腳本加載它

$.getScript('script.js', function() { 
    $('.a').append('<div class="yep">' + divs.join('') + '</div>'); 
    $('.item').each(function() { 
     $(this).click(function() { 
      console.log($('.item').index(this)); 
     }); 
    });  
}); 

的問題是,點擊我需要獲得數組中的項目的索引,即如果我點擊「Lorem ipsum 4」控制檯應該打印「4」,而不是「3」,因爲它現在發生(因爲刪除的元素不出現在DOM)。 有沒有辦法使用jQuery獲得正確的結果?

好的,我需要說這是一項任務。這是事情:我簡直不能修改script.js。假設它在服務器上,並且在我得到它之前我無法訪問它。但我需要它在原始數組中具有的元素的索引。

+0

一個可能的解決方案是將具有div元素的索引存儲在數據屬性中,如下所示:'

Lorem Ipsum 3
' –

+0

是的,您需要一個替代解決方案。因爲在運行.each()之前div已被刪除;該元素及其索引消失了。如上所述,您必須以另一種方式保存數據屬性。 – Syon

+0

我無法修改script.js文件,我不需要從數組中刪除項目。我只需要得到正確的索引 – kibin

回答

2

嘗試是這樣的:

http://jsfiddle.net/YjNAL/1/

var divs = [ 
    '<div class="item">Lorem ipsum 0</div>', 
    '<div class="item">Lorem ipsum 1</div>', 
    '<div class="item">Lorem ipsum 2</div>', 
    '<div class="item">Lorem ipsum 3</div>', 
    '<div class="item">Lorem ipsum 4</div>', 
    '<div class="item">Lorem ipsum 5</div>', 
    '<div class="item">Lorem ipsum 6</div>', 
    '<div class="item">Lorem ipsum 7</div>' 
]; 
delete(divs[3]); 

var yep = $('<div class="yep"></div>'); // Changed (from edit) 

for (var i = 0; i < divs.length; i++) { 
    if (divs[i]) { // Don't operate on undefined items 
     var theDiv = $(divs[i]).data("idx", i); // Changed (from edit) 

     yep.append(theDiv); // Changed (from edit) 
    } 
} 

$(".a").append(yep); // Changed (from edit) 

$('.item').on("click", function() { 
    console.log($(this).data("idx")); 
}); 

注意原始數組未被修改。

數組中的每一項都被修改,並在追加之前創建一個jQuery對象。我相信這部分可以做得更有效率,我只是想把東西扔在一起。

它將其索引存儲在for循環的數組中,因此應該是準確的。

任何未定義(刪除)的項目都被忽略。

+0

好的,爲智慧+1。不過,我希望這就是OP的真實代碼所做的。 – Blazemonger

+1

@Blazemonger謝謝:)這是我唯​​一可以想到的方式,即不觸及OP中的第一塊代碼,但仍然保留索引而不會有任何不可靠的黑客行爲。還有可能會改變。真的,誰知道實際上正在使用什麼......它可能會更難以做 – Ian

+0

這正是我需要的,謝謝! – kibin

4

您正在詢問點擊項目的INDEX。你的代碼正在做它應該做的事情。 jQuery沒有辦法知道你是否從原始列表中刪除了項目,它只能看到當前有什麼。

最好的解決方案是將HTML屬性添加到原始項目,console.log屬性而不是.index。就像這樣:

var divs = [ 
    '<div data-idx="0" class="item">Lorem ipsum 0</div>', 
    '<div data-idx="1" class="item">Lorem ipsum 1</div>', 
    '<div data-idx="2" class="item">Lorem ipsum 2</div>', 
    '<div data-idx="3" class="item">Lorem ipsum 3</div>', 
    '<div data-idx="4" class="item">Lorem ipsum 4</div>', 
    '<div data-idx="5" class="item">Lorem ipsum 5</div>', 
    '<div data-idx="6" class="item">Lorem ipsum 6</div>', 
    '<div data-idx="7" class="item">Lorem ipsum 7</div>' 
    ]; 
delete(divs[3]); 


$('.a').append('<div class="yep">' + divs.join('') + '</div>'); 

$('.item').each(function() { 
    $(this).click(function() { 
     console.log($(this).data('idx')); 
    }); 
});​ 

http://jsfiddle.net/mblase75/8NLGm/

+0

我無法修改div數組 – kibin

+0

在訪問數組之前,您的代碼無法知道數組中的內容已被刪除。你需要繼續前進。我們可以解析div的'.text()'來提取數字,但我懷疑這是您真正使用的內容。 – Blazemonger

-1

你可以try this。給所有的div的ID,並獲取:

var divs = [ 
    '<div class="item" id="0">Lorem ipsum 0</div>', 
    '<div class="item" id="1">Lorem ipsum 1</div>', 
    '<div class="item" id="2">Lorem ipsum 2</div>', 
    '<div class="item" id="3">Lorem ipsum 3</div>', 
    '<div class="item" id="4">Lorem ipsum 4</div>', 
    '<div class="item" id="5">Lorem ipsum 5</div>', 
    '<div class="item" id="6">Lorem ipsum 6</div>', 
    '<div class="item" id="7">Lorem ipsum 7</div>' 
]; 
delete(divs[3]); 

$('.a').append('<div class="yep">' + divs.join('') + '</div>'); 
$('.item').each(function() { 
    $(this).click(function() { 
     console.log(this.id); 
    }); 
}); ​ 

號在ID的?!?

是的,我知道,在HTML4 id以數字開頭是不允許的。但是HTML5刪除了這個限制。
這些div將根據w3 validator進行驗證。

+0

謝謝,它的工作! 你能解釋一下你的解決方案嗎? – kibin

+3

Nitpick:以數字開頭的ID是無效的HTML 4,儘管它們通常在瀏覽器中工作。 – Blazemonger

+0

這很簡單:'this'是點擊元素。 'this.id'是該元素的'id',在'id =「0」'ect中設置。 @Blazemonger:我還沒有看到一個瀏覽器無法處理以數字開頭的id。 如果誰低估了我會給出一個正確的理由,也許我可以從中學習。 – Cerbrus

-1

如果你寧願有它有點活力,你可以創建一個元素,一個數據字段添加到它,然後訪問該元素:

var divs = [ 
    '<div class="item">Lorem ipsum 0</div>', 
    '<div class="item">Lorem ipsum 1</div>', 
    '<div class="item">Lorem ipsum 2</div>', 
    '<div class="item">Lorem ipsum 3</div>', 
    '<div class="item">Lorem ipsum 4</div>', 
    '<div class="item">Lorem ipsum 5</div>', 
    '<div class="item">Lorem ipsum 6</div>', 
    '<div class="item">Lorem ipsum 7</div>' 
    ]; 
var newdivs = $('<div class="yep">').append(divs.join("")); 
newdivs.find('.item').each(function() { 
    $(this).data("myindex", $(this).index()); 
}); 
var elementToDelete = 3 
delete(divs[elementToDelete]); 
newdivs.find('.item').eq(elementToDelete).remove(); 
$('.a').append(newdivs); 

$('.a').on('click','.item',function() { 
    $(this).css("background-color","lime"); 
    alert($(this).data("myindex")); 
}); 

看看它是如何在這裏工作: http://jsfiddle.net/rZjNd/2/

+0

那個小提琴的提醒'undefined'對我來說。 (谷歌瀏覽器) – Cerbrus

+0

修正了它,是我的一個重構的語法問題:) –

+0

在這個解決方案中,我需要更改原始腳本,我不能這麼做 – kibin

相關問題