我有一个围绕包装器构建的页面,其中包含一些非常明确的逻辑。包装表单底部有一个Save按钮,如下所示:
<form>
... my page goes here...
<input id="submitBtnSaveId" type="button" onclick="submitPage('save', 'auto', event)" value="Save">
</form>
这不能改变......
现在,我正在将一些javascript写入加载到“...我的页面到此处...”的页面中。代码加载很好并按预期运行。它在表单元素周围做了一些工作,我甚至注入了一些页面验证。这就是我被困住的地方。我试图“拦截”onclick并停止页面调用“submitPage()”如果验证失败。我正在使用prototype.js,所以我尝试了所有变体和组合:
document.observe("dom:loaded", function() {
Element.observe('submitBtnSaveId', 'click', function (e) {
console.log('Noticed a submit taking place... please make it stop!');
//validateForm(e);
Event.stop(e);
e.stopPropagation();
e.cancelBubble = true;
console.log(e);
alert('Stop the default submit!');
return false;
}, false);
});
没有什么可以阻止“submitPage()”被调用!观察实际上工作并触发控制台消息并显示警报一秒钟。然后“submitPage()”开始,一切都会再见。我已经删除了附加在Firebug按钮上的onclick,我的验证和警报都按预期工作,所以它让我认为传播并没有真正停止onclick?
我错过了什么?
答案 0 :(得分:3)
因此,基于您无法更改HTML的事实 - 这是一个想法。
保留当前的javascript以捕获click事件 - 但将其添加到dom:loaded事件
$('submitBtnSaveId').writeAttribute('onclick',null);
这将删除onclick属性,因此希望该事件不会被调用
所以你的javascript看起来像这样
document.observe("dom:loaded", function() {
$('submitBtnSaveId').writeAttribute('onclick',null);
Element.observe('submitBtnSaveId', 'click', function (e) {
console.log('Noticed a submit taking place... please make it stop!');
//validateForm(e);
Event.stop(e);
e.stopPropagation();
e.cancelBubble = true;
console.log(e);
alert('Stop the default submit!');
return false;
submitPage('save', 'auto', e);
//run submitPage() if all is good
}, false);
});
答案 1 :(得分:2)
我接受了Geek Num 88提出的想法,并将其扩展到完全满足我的需要。我不知道覆盖属性的能力,这太棒了!问题仍然是我需要运行submitPage()如果一切正常,并且该方法的参数和调用可能每页不同。这最终变得比仅仅成功的简单调用更棘手。这是我的最终代码:
document.observe("dom:loaded", function() {
var allButtons = $$('input[type=button]');
allButtons.each(function (oneButton) {
if (oneButton.value === 'Save') {
var originalSubmit = oneButton.readAttribute('onclick');
var originalMethod = getMethodName(originalSubmit);
var originalParameters = getMethodParameters(originalSubmit);
oneButton.writeAttribute('onclick', null);
Element.observe(oneButton, 'click', function (e) {
if (validateForm(e)) {
return window[originalMethod].apply(this, originalParameters || []);
}
}, false);
}
});
});
function getMethodName(theMethod) {
return theMethod.substring(0, theMethod.indexOf('('))
}
function getMethodParameters(theMethod) {
var parameterCommaDelimited = theMethod.substring(theMethod.indexOf('(') + 1, theMethod.indexOf(')'));
var parameterArray = parameterCommaDelimited.split(",");
var finalParamArray = [];
parameterArray.forEach(function(oneParam) {
finalParamArray.push(oneParam.trim().replace("'","", 'g'));
});
return finalParamArray;
}