我花了几个小时,也许几天都陷入了一个非常奇怪的问题:(
我正在创建一个基于Wicket解决方案的应用程序。它在IE9,IE10,Chrome和FF中完美运行。奇怪的是,我已经在IE8中对它进行了测试,它在99%的情况下工作(IE实例在不同的计算机上+完全相同的IE8版本)。但现在问题。
问题: 我正在通过AjaxLink按钮创建动态内容。单击按钮后,WebMarkupContainer模型被更改,WebMarkupContainer被刷新(基于Ajax,因此页面没有重新加载完成,但只有容器是)。
容器中的每个项目都添加了AjaxFormComponentUpdatingBehavior。在onComponentTag方法中,我添加tag.put(“onchange”,“some jsFunctionCalling ....”);.问题是,单击该项后,不会调用任何事件。我试过在.add(new AttributeModifier .....)上添加onchange监听器,但结果仍然相同。正如我所说,我在另一台PC上的同一版本的IE中尝试了相同的代码,它运行良好。 有趣的是,在刷新页面之后,一切都工作得很完美,直到添加到WebMarkupContainer的新项目。之后,在页面再次刷新之前,没有项目监听器工作。
我得到的最新想法之一是,问题不在代码中,而是在IE的设置中(可能是安全性)。有什么想法吗?什么设置可以设置不同并导致这些问题? Wicket网站上有任何设置,可以解决这个问题吗?是否有一些设置可以阻止这些侦听器注册到DOM,如果它们是通过ajax动态添加的?
答案 0 :(得分:1)
我没试过,但恕我直言,你可以尝试三种选择:
OnChangeAjaxBehavior
并在wicket中完成所有工作。下行是每次活动的服务器往返。AttributeModifier.append("data-param1", "foobar")
)以将参数推送到html,并在AjaxLink上的click事件之后调用ajaxRequestTarget.appendJavaScript("attachOnChangeHandler()");
。 attachOnChangeHandler()
应该是你的js函数,为每个需要它的项添加onchange处理程序。通过数据属性,您可以访问参数。@peterchon提供的解决方案(将DOM中的事件处理程序附加到将被wicket替换的元素)将适用于所有其他情况,但是您的“onchange”仅适用于输入,textarea和选择元素。
BTW页面在刷新后“正常工作”,因为整个页面都会呈现,浏览器可以正确地附加处理程序。
答案 1 :(得分:0)
您可以尝试以下方法:
/* this will catpure the target that triggered the event */
function getEventTarget( e ) {
e = e || window.event;
return e.target || e.srcElement;
}
function doSomething( e ) {
var that = getEventTarget( e );
if( that.tagName.toLowerCase() === 'a' ) { // specify the target, in this cas <a>
// Do something
}
}
parentElement.onclick = doSomething;
这个脚本基本上会捕获任何事件,然后将target的变量传递给将执行某些操作的函数。
希望这对你有用。
答案 2 :(得分:0)
您尝试使用非wicket JavaScript / Ajax方式实现某些功能。这很好,但也使它非常混乱。
请查看关于将参数从JavaScript传递到wicket的精美文章,反之亦然。我认为它会满足您的需求。
http://wickedsource.org/2013/01/07/rolling-your-own-ajax-behavior-with-wicket/