我正在尝试使用Greasemonkey在Firefox中编写我的第一个用户脚本。我做了很多研究,因为我是用户脚本和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和用户脚本的新手,我只是想先做这个工作。到目前为止,“脚本已加载”。正在显示,以排除许多可能的问题。当我在firebug中只运行这部分代码时,它运行正常:
$(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'然后让我知道。它说“脚本已加载”。每次我去Stack Overflow。哈的
--------------------------------------
更新:我只是试着这样做进行测试:
$(document)
.on('click', this, function(){
alert('Please Work!!!!');
})
我一直试图点击的东西是没有显示消息的东西。加载页面后,所有这些都加载了javascript。我几乎是肯定的,因为他们不允许我点击它们。有没有办法点击这些项目。在HTML脚本中,它们看起来与其他元素相同。
答案 0 :(得分:3)
你说你已经在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事件,允许您添加包含这些选择器的新元素,并且将调用侦听器而无需将事件处理程序专门附加到那些元素。
P.S。
在这种特定情况下,您甚至不需要$(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;
,这可能会阻止事件进一步向上冒泡
答案 1 :(得分:1)
你说,当你从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);
}