jQuery .click()在Firebug中运行,但不是Greasemonkey脚本?

dut 发布于 2019-02-11 greasemonkey 最后更新 2019-02-11 21:14 5 浏览

我正尝试在Firefox中使用Greasemonkey编写我的第一个用户脚本。我做了很多研究,因为我对userscripts和jQuery是新手,但似乎无法使这个简单的测试脚本正常工作。到目前为止,我在Test.user.js文件中有这个:

// ==UserScript 
// @name            Desk Notifications 
// @description     Displays special notifications to NVOWS coaches at desk.com
// @downloadURL     http://www.example.com/deskNotifications.user.js
// @include         http://nvows.desk.com/agent
// @namespace       http://www.example.com/userscripts
// @updateURL       http://www.example.com/deskNotifications.meta.js
// @version         0.1
// @grant           none
// ==/UserScript
$(document).ready(function(){ 
    alert('Script loaded.'); 
    $('.interaction_type_60').click(function() { 
        alert("You clicked a case!"); 
    }); 
    $('.interaction_type_40').click(function() { 
        alert("You clicked a case!"); 
    }); 
});
点击 我需要做的事情显然要复杂得多,但因为我对jQuery和用户脚本不熟悉,所以我只想先做好这件事。到目前为止,“加载的脚本”。正在显示,以便排除很多可能的问题。当我只在萤火虫中运行这部分代码时,它工作正常:
$(document).ready(function(){ 
    alert('Script loaded.'); 
    $('.interaction_type_60').click(function() { 
        alert("You clicked a case!"); 
    }); 
    $('.interaction_type_40').click(function() { 
        alert("You clicked a case!"); 
    }); 
});
这样就排除了代码错误或抓取错误的类选择器。如果代码是正确的并且正在执行,我看不出有什么问题。如果有人可以帮助,将不胜感激。我不是编程的新手。只是基于网络的东西。

这是我试图看到它被点击时HTML页面的一部分。
<tbody id="ticket_filter_list_items" class=" ">
<tr id="ticket_filter_item_73354627" class="ticket_filter_item ticket_filter_item_table_view interaction_type_60 ticket_filter_item_open ticket_filter_item_current_selected" onclick=" ticketEditTableView(73354627, event);return false; " data-in-search="" data-ticket-id="73354627" style="">
<tr id="ticket_filter_item_73382205" class="ticket_filter_item ticket_filter_item_table_view interaction_type_40 ticket_filter_item_open " onclick=" ticketEditTableView(73382205, event);return false; " data-in-search="" data-ticket-id="73382205" style="">
</tbody>


这不是一个大问题,但如果你看到的东西会使这个脚本在不是'http://nvows.desk.com/agent'的网页上执行,那么让我知道。它说“脚本已加载”。每次我去堆栈溢出。哈。搜索结果 --------------------------------------搜索结果 更新:我只是试图做这个测试:
$(document)
.on('click', this, function(){
    alert('Please Work!!!!');
})
我一直试图点击这些东西的东西是没有显示消息的东西。所有这些都在页面加载后使用JavaScript加载。我几乎是积极的,这是他们不会允许我点击它们的原因。有没有办法点击这些项目。在HTML脚本中,它们看起来与其他元素相同。
已邀请:

ut_sed

赞同来自:

你说你已经在firebug控制台上运行了代码并且工作正常,这里留下的选项很少。 我相信您尝试添加这些事件的HTML标记尚未创建。如果这些元素是通过JavaScript创建的,并且创建它们的代码尚未运行,则会发生这种情况。另一种可能性是元素在DOM上,但尚未接收到这些类,如果使用JavaScript给出类,也可能会发生。 试试这个代码示例,看看它是否有帮助(让我知道结果):

$(document).ready(function(){ 
    alert('Script loaded.'); 
    $(document)
        .on('click', '.interaction_type_60', function() { 
            alert("You clicked a case!"); 
        })
        .on('click', '.interaction_type_40', function() { 
            alert("You clicked a case!"); 
        }); 
});
注意:当您的原始代码运行时,您尝试将这些事件附加到元素上的元素必须出现在DOM上,并且它们必须具有您定义的类。我的代码所做的是将事件附加到document元素并查找冒泡元素链的click事件,允许您添加包含这些选择器的新元素,并且无需您专门将事件处理程序附加到那些元素。 附: 在这种特定情况下,您甚至不需要$(document).ready(..)部分。你可以使用:
$(document)
    .on('click', '.interaction_type_60', function() { 
        alert("You clicked a case!"); 
    })
    .on('click', '.interaction_type_40', function() { 
        alert("You clicked a case!"); 
    });
因为事件附加到始终存在的文档元素。 编辑:看到你标记后我认为问题也可能是内联onclick事件使用return false;,这可能会阻止事件在链中进一步冒泡。

iipsa

赞同来自:

你说,当你从Firebug运行原始的.click()代码时,它可以工作。 正如iMoses指出的那样,它不适用于Greasemonkey脚本,因为脚本在页面的javascript创建目标节点之前触发。 您还报告.on()代码无法从脚本或Firebug中运行。这意味着目标节点的onclick函数(ticketEditTableView())正在停止事件冒泡。它可能会调用event.stopPropagation()。 解决方案是返回.click(),但在将目标节点添加到页面时应用它。这可以通过the waitForKeyElements() utility完成。 这是一个完整的脚本,它使用waitForKeyElements.click()绑定到这些节点,因为它们被添加到页面中:

// ==UserScript
// @name        Desk Notifications
// @description Displays special notifications to NVOWS coaches at desk.com
// @downloadURL http://www.example.com/deskNotifications.user.js
// @include     http://nvows.desk.com/agent
// @namespace   http://www.example.com/userscripts
// @updateURL   http://www.example.com/deskNotifications.meta.js
// @version     0.1
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant GM_addStyle directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
waitForKeyElements (
    ".interaction_type_60, .interaction_type_40", addAlertOnClick
);
function addAlertOnClick (jNode) {
    jNode.click (alertOnClick);
}
function alertOnClick (zEvent) {
    var targNode    = $(zEvent.currentTarget);
    var messageStr  = "Oopsie!";
if (targNode.hasClass ("interaction_type_60") ) {
        messageStr  = "You clicked a type 60 case!"
    }
    else if (targNode.hasClass ("interaction_type_40") ) {
        messageStr  = "You clicked a type 40 case!"
    }
alert (messageStr);
}