- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有纯 js 代码,其中事件处理程序更改全局变量而不将其传入。
"use strict";
var outsideEventString ="hello";
console.log("before event " + outsideEventString);
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
/*
Assume a and b are outside your control,
but you still need to set the outsideEventString arg
*/
myEmitter.on('event', function(a, b) {
console.log(a, b, this);
console.log("inside event " + outsideEventString);
outsideEventString="goodbye";
});
myEmitter.emit('event', 'a', 'b');
// this prints out goodbye which is set in the handler only
console.log("after event " + outsideEventString);
将 onDOMContentLoaded
事件和处理程序添加到 phantomjs 示例 netlog.js 后,代码如下所示:
"use strict";
console.log("netlog.js");
var page = require('webpage').create(),
system = require('system'),
address;
var valueString = "hello";
var value1 = {
current: false,
timeStamp: null
};
if (system.args.length === 1) {
//console.log('Usage: phantomjs netlog.js <some URL>');
phantom.exit(1);
} else {
var PHANTOM_FUNCTION_PREFIX = '/* PHANTOM_FUNCTION */';
address = system.args[1];
page.onConsoleMessage = function(msg) {
if (msg.indexOf(PHANTOM_FUNCTION_PREFIX) === 0) {
eval('(' + msg + ')()');
} else {
console.log(msg);
}
};
page.onInitialized = function() {
// add handler & apply value1 to handler's scope'
page.evaluate(function(domContentLoaded) {
document.addEventListener('DOMContentLoaded', domContentLoaded, false);
}, page.onDOMContentLoaded.apply(this, value1));
};
// handler has access to value1 and valueString
page.onDOMContentLoaded = function(event) {
value1.current = true;
value1.timeStamp = Date.now();
valueString="goodbye";
console.log('**** DOM CONTENT LOADED ****');
};
page.onResourceReceived = function (res) {
console.log('received ' + res.id + ' ' + res.stage);
};
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
//console.log(' ', item.file, ':', item.line);
});
};
page.open(address, function (status) {
console.log("page opened");
if (status !== 'success') {
console.log('FAIL to load the address');
}
console.log("value = " + JSON.stringify(value1));
console.log("valueString=" + valueString);
phantom.exit();
});
}
在代码中,valueString 是“再见”,即使它不是通过 .apply(this,value1)
传入的。
输出显示:
netlog.js
received 1 start
received 1 end
received 2 end
received 3 start
received 3 end
**** DOM CONTENT LOADED ****
received 5 start
received 5 end
received 6 start
received 6 end
received 7 start
received 9 start
received 8 start
received 7 end
received 9 end
received 8 end
received 4 start
received 4 end
page opened
value = {"current":true,"timeStamp":1473693805039}
valueString=goodbye
**** DOM CONTENT LOADED ****
**** DOM CONTENT LOADED ****
valueString
变量设置在收到 id 3 的正确 url 处,并且它会粘住,以便我可以在 page.open
中看到它。
为什么在 page.open 之后打印“**** DOM CONTENT LOADED ****”?
但是,如果我将 page.onInitialized
更改为以下内容,而不应用,则 value1
或 valueString
都不会被设置。
page.onInitialized = function() {
// add handler & apply value1 to handler's scope'
page.evaluate(function(domContentLoaded) {
document.addEventListener('DOMContentLoaded', domContentLoaded, false);
}, page.onDOMContentLoaded);
};
为什么我需要使用 apply 方法来获取要在处理程序内设置的全局变量?
为什么我只需将 value1
传递给 apply 即可设置 valueString
?
最佳答案
page.evaluate
是 PhantomJS 中页面上下文的大门。只能传入原始对象。来自docs :
Note: The arguments and the return value to the
evaluate
function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.Closures, functions, DOM nodes, etc. will not work!
因此,page.onDOMContentLoaded
是一个函数,不能传递到页面上下文中。您必须将对象传递到页面上下文并在那里定义一个函数。
您可以使用类似的内容(使用 the onCallback
& callPhantom
pair ):
page.onCallback = function(data){
if (data.type == 'DOMContentLoaded') {
console.log('outer: DOMContentLoaded');
}
};
page.onInitialized = function() {
page.evaluate(function(value1) {
// TODO: do something with value1
document.addEventListener('DOMContentLoaded', function(){
console.log('inner: DOMContentLoaded');
window.callPhantom({ type: 'DOMContentLoaded' });
}, false);
}, value1);
};
<小时/>
Why does '**** DOM CONTENT LOADED ****' print after the page.open?
请记住,Function.prototype.apply
会立即执行函数。在本例中,它是 page.onInitialized
内部的 page.onDOMContentLoaded
函数。因此,每当页面“初始化”时,您都会看到 page.onDOMContentLoaded
的执行结果。
为什么执行停止后会初始化两个页面是一个完全不同的问题。这可能只是 PhantomJS 的一些特性。
关于javascript - 更改事件中的全局变量无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453981/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!