2011-08-23 100 views
0

我寫了一個移除和重寫內容的小頁面。加載頁面後我調用了一個函數,它也應該在改變頁面後執行。因爲我不會執行這個函數兩次(在初始化和更改頁面後),我嘗試了bind()/ live()和一個簡單的函數。函數內的Jquery bind()/ live()

功能如下:

jQuery('.blogentry').each(function(){ 
    jQuery(this).click(function(){ 
     //Clicking on the element opens a layer, definitely works - I tested it 
    }); 
}); 

它初始化後執行,頁面更改後執行它,以及我試過如下:

jQuery('.nextPage, .prevPage').click(function changePage(){ 
    // Changing page and rewriting content 
    showEntry(); 
}); 
//... 
showEntry(); 
//... 
function showEntry(){ 
jQuery('.blogentry').each(function(){ 
    jQuery(this).click(function(){ 
     //Clicking on the element opens a layer, definitely works - I tested it 
    }); 
}); 
} 

但功能不被執行放入一個函數(lol)並通過showEntry()調用;

後來我試圖綁定功能...

jQuery('.nextPage, .prevPage').click(function changePage(){ 
    // Changing page and rewriting content 
    jQuery('.blogentry').bind("click", showEntry); 
}); 
//... 
jQuery(this).click(function showEntry(){ 
    //Clicking on the element opens a layer, definitely works - I tested it 
}); 

也不能工作。 bind()之後的代碼行也不會執行。 我想,也許這是綁定到一個事件功能的問題,如果事件是通過參數已經給了,所以我也試過這樣:

jQuery('.nextPage, .prevPage').click(function changePage(){ 
    // Changing page and rewriting content 
    jQuery('.blogentry').bind("click", showEntry); 
}); 
//... 
function showEntry(){ 
    //Clicking on the element opens a layer, definitely works - I tested it 
}); 
} 

沒有成功可言。也許我不能從關於bind()的函數內部調用函數?也許我只是不明白bind()函數?我也嘗試過live()函數,因爲它似乎更合適,因爲我一直在重寫內容。但它有同樣的效果:無...

+0

目前尚不清楚你想達到的目標。你正試圖在另一個點擊事件中將函數綁定到單擊事件? – Ben

+0

是的,但第一次點擊事件的變化和重寫的內容,所以事後新的書面內容,應當重新綁定到其打開層的功能。這個函數是一個點擊事件,以及在開始時initalised,但是當內容被改寫 – SamiSalami

+0

應執行我想他的意思是對SM控制頁面佈局的改變之後,他需要綁定一個click事件上的點擊SM頁面上的新的管制措施。對於現場的理想的競爭者,但..但NT確保你的問題是什麼 – Baz1nga

回答

1

來實現,這應該是

jQuery('.blogentry').live('click', function() { /* onclick handler */ }); 

這應該在通話瞬間的功能結合到每blogentry在頁面上,最簡單的方式,所有的稍後添加到頁面中的水族箱。

其他備註:

$(foo).each(function() { $(this).click(fun); });的每個是不必要 - $(foo).click(fun);就足夠了。

$(foo).bind('click', fun);在功能上等同於$(foo).click(fun) - 您使用哪一個並不重要。

+0

完美的作品,非常感謝。我只是太複雜了! – SamiSalami

1

您可以使用委託或綁定。不要調用這樣的函數,只需使用.blogentry創建一個委託,即使在通過ajax加載新頁面後,它也應該更新。它會自動執行此操作。

$("#blogcontainer").delegate(".blogentry", "click", function(){ //open layer });

+0

謝謝! live() - 解決方案適用於我,但我確信它可以很好地工作! – SamiSalami

+0

@samiSalami只是一個注意,代表應該用於live()。性能要好很多。 – Matt

+0

謝謝。我會記住這一點,並且可能會改變這種情況,儘管目前爲止我沒有任何性能問題(頁面上沒有那麼多問題;-))。 – SamiSalami

1

這應該爲你工作

$(body).delegate(".blogentry", "click", function(){ 
    showEntry(); 
}); 
+0

謝謝!我選擇了live() - 解決方案,但我相信它也可以與delegate()一起使用! – SamiSalami

+0

都很好。委託只需要更快,因爲活動需要文檔作爲父元素,委託可以讓您指定最接近的父項。即身體可能變爲$('#container')作爲可點擊元素周圍的包裝的位置 – Ben

1

alternaltivly您可以使用事件代表團

$(document).ready(function() { 
    $('#blogcontainer').click(function(e) { 
    if ($(e.target).is('.blogentry')) { 
     // do your stuff 
    } 
    }); 
}); 

因此,沒有必要每個blogentry綁定在創建或重裝,和它的(稍微)更快。

+0

謝謝!似乎是一個很好的選擇! – SamiSalami