0

Given the following HTML:

<table class="cat_list">
<tr>
    <td>
        <input type="checkbox" name="filter_cat[1]" id="cat_1" value="1"/>
        <label for="cat_1">Music</label>
    </td>
    <td>
        <input type="checkbox" name="filter_cat[2]" id="cat_2" value="1"/>
        <label for="cat_2">Applications</label>
    </td>
    <td>
        <input type="checkbox" name="filter_cat[3]" id="cat_3" value="1"/>
        <label for="cat_3">E-Books</label>
    </td>
    <td>
        <input type="checkbox" name="filter_cat[4]" id="cat_4" value="1"/>
        <label for="cat_4">Audiobooks</label>
    </td>
    <td>
        <input type="checkbox" name="filter_cat[5]" id="cat_5" value="1"/>
        <label for="cat_5">E-Learning Videos</label>
    </td>
    <td>
        <input type="checkbox" name="filter_cat[6]" id="cat_6" value="1"/>
        <label for="cat_6">Magazines</label>
    </td>
    <td>
        <input type="checkbox" name="filter_cat[7]" id="cat_7" value="1"/>
        <label for="cat_7">Comics</label>
    </td>
</tr>

The following script should uncheck all checkboxes in the table row, then check the one specific one with id cat_1.

$(".cat_list input[type='checkbox']").attr("checked",false);

$("#cat_1").attr("checked",true);

In Greasemonkey, it checks the one box for a millisecond then just unchecks all boxes. The second command alone DOES check the cat_1 box when executed alone, but when you add the line above it, they all get unchecked after...

So, is Greasemonkey executing things incorrectly or what? it looks like it's running the script backwards or there's a timing issue, like it's starting the unchecks async then finishing the check before the uncheck can finish.

4

2 回答 2

1

可能是你的脚本的 jQuery 和页面有冲突。一个简单的@grant GM_addStyle可以修复它。发布您的完整脚本。


否则,该 jQuery 代码将同步运行。该页面的 javascript 正在干扰您尝试执行的操作,或者问题中省略了某些键。

可能您的脚本在页面完成设置之前触发。如果可以的话,链接到实际的目标页面。

分析作用于这些输入的页面 javascript,并考虑使用页面自己的 JS 进行更改。页面可能需要/期望设置状态,而不仅仅是切换复选框。

通过脚本注入或通过unsafeWindow.


使用计时器,就像在 psyjoniz 的回答中一样,可能就足够了。也许不会。但是,尝试起来很容易。我会使用更长的时间间隔:

$(".cat_list input[type='checkbox']").attr ("checked", false);

//-- Give the page's JS time to react and settle.
setTimeout ( function () { $("#cat_1").attr ("checked", true); }, 100);
于 2013-09-10T22:32:12.027 回答
0

尝试这个 ..

setTimeout(function(){$("#cat_1").attr("checked",true);},0);

如果这是某种竞争条件,这会将您的命令放在堆栈的底部。

于 2013-09-10T17:58:18.063 回答