2012-08-24 76 views
1

我的公司使用基於Web的產品,其UI需要我們點擊超過200個複選框才能滿足某些用例。我們要求提供「全部取消」功能,但顯然不是即將推出的。GreaseMonkey jQuery腳本隻影響一個元素

我試着寫一個簡單的GreaseMonkey腳本來解決這個問題:

$('img').click(function() { 
    $('input.HideQuestion:checked').each(function() { 
     $(this).click(); 
    }); 
}); 

(有一個形象,我們的標誌,我的點擊目標在頁面上使用)

麻煩的是,每次點擊圖片時,只有一個(〜270)複選框會受到影響。每增加一次點擊都會影響下一個複選框。

我可以看到,每次勾選複選框時,網站都會發出Ajax調用,但該Ajax調用的響應正文爲空,因此我認爲它們只是更新服務器上的狀態,而不是替換部分頁面。

爲什麼只有一個複選框最終會被取消選中?

當我用另一種方法

$(this).prop("checked", true); 

所有複選框是選中視覺,但Ajax調用沒有發生,服務器狀態從不更新。另外,當我檢查任何複選框時,所有複選框都會恢復到GreaseMonkey之前的狀態。

UPDATE

我嘗試以下兩個建議由@BrockAdams攔截Ajax調用。正在調用alert()

覆蓋XMLHttpRequest.prototype.open https://stackoverflow.com/a/7778218/141172

(function() { 
    var proxied = window.XMLHttpRequest.prototype.open; 
    window.XMLHttpRequest.prototype.open = function() { 
     alert('A-ha! Open!'); 
     return proxied.apply(this, [].slice.call(arguments)); 
    }; 
})(); 

攔截目標頁面的AJAX使用.ajaxSuccess()
https://stackoverflow.com/a/8252726/141172

// Also tried: unsafeWindow.$('body').ajaxSuccess (
$('body').ajaxSuccess ( 
     function (event, requestData) 
     { 
      alert('A-ha. Success!'); 
     } 
    ); 
+0

_所有的複選框在視覺上都是未經檢查的_您將checked屬性設置爲'true',這將檢查所有複選框,但不會取消選中它們。 – undefined

+0

@undefined:是的,我知道。想要提及的是,我也嘗試過(但放棄)這種方法。 –

+0

這比觸發200次以上的點擊事件更好。 – undefined

回答

2

我們真的需要查看目標頁面的JS代碼。但是,這聽起來像目標頁面正在等待AJAX​​響應,然後設置內部狀態。它也可能覆蓋服務器維護狀態的本地狀態。

如果這是真的,那麼在每次取消選中之後,您需要等待服務器響應,或者目標網頁的javascript可能會提供更好的解決方案。

待您提供更多的細節(目標頁面是否特別jQuery的使用這個特定的AJAX),這裏是應該工作的一般方法:

  1. 使用$('input.HideQuestion:checked').each()來填充jQuery queue
  2. 如果可能,使用.ajaxSuccess()攔截目標頁面的AJAX。或者通過覆蓋XMLHttpRequest.prototype.open,如果不是。
  3. 在每次成功完成AJAX,dequeue的下一個項目,如果有的話,從步驟在隊列中剩餘的1

    設置的dequeue功能以取消選中其複選框匹配。

+0

不幸的是,有問題的應用程序是專有的。你的方法聽起來有趣。但是,我似乎無法執行2.發佈了我的三次嘗試。你看到鱈魚有問題嗎? –

+0

'unsafeWindow。$('body').ajaxSuccess()'可以工作,但前提是目標頁面使用jQuery(通常)爲其AJAX。可以? ...'XMLHttpRequest.prototype.open'方法不是我這樣做的方式,但它應該*工作(未經測試),IF IF,並且只有在**時,纔會將覆蓋代碼注入到目標頁面中。此外,爲了您的目的,您需要聽取響應中的狀態''200'。 –

+0

查看http://stackoverflow.com/a/6805461/獲取來自Greasemonkey的通用AJAX攔截方法的一個實現。 –

0

試試這個:

$('img').click(function() { 
    $('input[type="checkbox"]:checked').prop('checked', false) 
}); 
+0

不幸的是,這並不「粘」,因爲在頁面有一些狀態,我點擊任何複選框後會重置。此外,UI設計是這樣的,只有當複選框被選中/取消選中時,頁面纔會刷新(yuck)。沒有「刷新」按鈕。單擊瀏覽器刷新按鈕可恢復存儲在服務器端的檢查狀態。 –

相關問題