我有一个函数,a()
我想要覆盖,但也有原始a()
的顺序执行,具体取决于上下文.例如,有时当我生成页面时,我想要覆盖如下:
function a() {
new_code();
original_a();
}
Run Code Online (Sandbox Code Playgroud)
有时像这样:
function a() {
original_a();
other_new_code();
}
Run Code Online (Sandbox Code Playgroud)
我如何original_a()
在超越范围内获得这一点a()
?它甚至可能吗?
请不要以这种方式建议替代方法,我知道很多.我特意问这个问题.
它让我觉得我document.querySelectorAll(...).map(...)
甚至不能在Firefox 3.6中做到这一点,我仍然无法找到答案,所以我想我会在这篇博客上交叉发帖:
http://blowery.org/2008/08/29/yay-for-queryselectorall-boo-for-staticnodelist/
有没有人知道你没有获得阵列的技术原因?或者为什么StaticNodeList不从数组继承以这样的方式,你可以使用map
,concat
等等?
(顺便说一句,如果它只是你想要的一个功能,你可以做类似NodeList.prototype.map = Array.prototype.map;
......但是,为什么这个功能(故意?)首先被阻止?)
我只是在阅读这个问题并且想尝试别名方法而不是函数包装方法,但我似乎无法在它们的调试窗口和Firefox 3或3.5beta4或Google Chrome中使用它们.在测试网页中.
萤火虫:
>>> window.myAlias = document.getElementById
function()
>>> myAlias('item1')
>>> window.myAlias('item1')
>>> document.getElementById('item1')
<div id="item1">
Run Code Online (Sandbox Code Playgroud)
如果我把它放在一个网页中,对myAlias的调用会给我这个错误:
uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: file:///[...snip...]/test.html :: <TOP_LEVEL> :: line 7" data: no]
Run Code Online (Sandbox Code Playgroud)
Chrome(为了清晰起见插入了>>>):
>>> window.myAlias = document.getElementById
function getElementById() { [native code] }
>>> window.myAlias('item1')
TypeError: Illegal invocation
>>> document.getElementById('item1')
<div id=?"item1">?
Run Code Online (Sandbox Code Playgroud)
在测试页面中,我得到了相同的"非法调用".
难道我做错了什么?其他人可以重现这个吗?
另外,奇怪的是,我只是尝试了它在IE8中工作.
我听说HTML5有window.postMessage()
,但似乎需要在窗口(或选项卡,整个问题)上有一个句柄,你要发布消息.如果我要向所有打开的窗口广播怎么办?这可能吗?
(我想要做的就是警告其他的窗口,没有任何服务器往返当用户做一些事情在影响别人一个窗口,使他们能够更新他们的内容.然而,虽然一些窗口可能从现有的开放--allowing我拦截和存储引用他们 - 一些新鲜的窗口可以由用户手动打开,然后选择书签或URL输入在这种情况下,似乎没有被拦截的方式和存储引用.)
我希望浏览器的行为就像用户点击某些内容时按Tab键一样.在点击处理程序中,我尝试了以下方法:
var event = document.createEvent('KeyboardEvent');
event.initKeyEvent("keypress", true, true, null, false, false, false, false, 9, 0);
this.input.focus()[0].dispatchEvent(event);
Run Code Online (Sandbox Code Playgroud)
和jQuery:
this.input.focus().trigger({ type : 'keypress', which : 9 });
Run Code Online (Sandbox Code Playgroud)
第一种方法似乎是最好的选择,但并不是很有效.如果我将最后两个参数更改为98,98,确实在输入框中输入了'b'.但是,9,0和9,9(前者我从MDC网站上取得的)都在FF3下的firebug中给我这些错误:
Permission denied to get property XULElement.popupOpen
[Break on this error] this.input.focus()[0].dispatchEvent(event);
Permission denied to get property XULElement.overrideValue
[Break on this error] this.input.focus()[0].dispatchEvent(event);
Permission denied to get property XULElement.selectedIndex
[Break on this error] this.input.focus()[0].dispatchEvent(event);
Permission denied to set property XULElement.selectedIndex
[Break on this error] this.input.focus()[0].dispatchEvent(event);
Run Code Online (Sandbox Code Playgroud)
我听说过(没有明确定义'此类')事件是"不可信的",这可能解释了这些错误.
第二种方法导致我作为event.which传递的任何值作为event.which,但没有效果(即使我使用98而不是9,在框中没有输入'b'.)如果我尝试设置事件在我传递的对象中的.data,当事件被触发时它最终未定义.以下是我用来查看的代码:
$('#hi').keypress(function(e) {
console.log(e); …
Run Code Online (Sandbox Code Playgroud) 这是我最近一直在考虑的另一个.我们在之前的讨论中得出结论:"自然主键是坏的,人工主键是好的." 之前使用Hibernate我已经看到Hibernate默认为所有表创建一个序列.起初我对此感到困惑,你为什么要这样做.但后来我看到了它使父母和孩子联系起来的优势.由于没有表具有相同的主键值,因此意外地将父项与不是子项的表链接不会产生任何结果.
有没有人看到这种方法的任何缺点.我只看到一个:你的数据库中不能有超过999999999999999999999999999的记录.
假设我在两个不同的命名空间中定义了方法:
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
void print()
{
//do work...
}
}
Run Code Online (Sandbox Code Playgroud)
该foo::print()
和bar::print()
功能是完全平等的.我的项目使用了这些函数的大量调用.
有没有办法删除其中一个print()
定义而不更改这些函数的调用?我的意思是类似下面的东西(当然,C++语言不允许这种结构,它只是一个例子):
namespace foo, bar //wrong code!
{
void print()
{
//do work...
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有办法按我的意愿重构代码,请告诉我,你喜欢以下决定吗?如果您的项目包含此类代码,您会感到高兴吗?:)
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
void print()
{
foo::print();
}
}
Run Code Online (Sandbox Code Playgroud)
加:
谢谢你们,我对你的答案非常满意.我想让你澄清一下:using ::foo::print
和之间有区别using foo::print
吗?
TL; DR:工作应用程序,克隆它,克隆无法从推送挂钩正确启动(但如果我在ssh中手动工作正常.) PATH
已添加正确的节点版本,但在最后一步的某处,错误的节点版本被前置到PATH
一次.
路径在这里是正确的:
remote: PATH = /var/lib/openshift/.../app-root/data//node-v4.x.x-linux-x64/bin:/var/lib/openshift/.../app-root/runtime/repo/node_modules/.bin:/var/lib/openshift/...//.node_modules/.bin:/opt/rh/nodejs010/root/usr/bin:/bin:/usr/bin:/usr/sbin
Run Code Online (Sandbox Code Playgroud)
然后立即错误,在这里的某个地方:
remote: Starting NodeJS cartridge
remote: Tue Aug 22 2017 15:39:10 GMT-0400 (EDT): Starting application 'staging' ...
Run Code Online (Sandbox Code Playgroud)
那么在最后两行中或之前表示了哪些脚本和钩子? PATH
不只是为自己添加线条......
我有一个运行OpenJhift v2应用程序,运行NodeJS版本,足以支持胖箭头表示法.
它似乎是根据Openshift上的Custom node.js版本设置的,因为该repo中的脚本(用于使用标记文件)存在于.openshift
.
我rhc create --from-app
根据工作原理设置了第二个,重置了repo,然后重新部署到它上面.第二个工作很好,除了最后一步node
:
remote: npm info ok
remote: NOTE: The .openshift/action_hooks/build hook is not executable, to make it executable:
remote: On Windows run: git update-index --chmod=+x .openshift/action_hooks/build
remote: On Linux/OSX run: chmod +x …
Run Code Online (Sandbox Code Playgroud) 我花了一段时间才弄清楚,几周前我在外语维基上找到了答案,这非常有帮助,所以我想我会分享.
我在一个PHP站点上与一个合作伙伴一起为客户工作.我们有一个共同的Mercurial存储库(在Bitbucket上),包括本地副本和实时站点.我们只有FTP访问实时站点(由于它只是一个FTP主机包,因此无法更改).
我希望能够将更改从存储库推送到实时站点.
到目前为止,我只是跟踪repo中已更改的文件,并使用FileZilla手动复制它们 - 这是一个容易出错且烦人的任务.我的想法是,在本地安装远程位置(即使用CurlFtpFS)并告诉mercurial自动将更改的文件复制到站点.理想情况下,我希望能够指定哪些更改,但这将是一个奖励.如果同步中的文件的本地状态是同步的就足够了.
有没有什么好方法可以使用linux命令行工具?