2013-10-06 21 views
2

我想使用由Strust2 jQuery插件内部使用的publish/subscribe框架。使用Struts 2 jQuery插件发布事件

用户可以从列表中选择一个帐号或在文本框中键入它。

我想在文本框或选择选项更改时发布事件。所以,用户只能键入文本框或从选择框中选择一些东西:

<s:textfield name="account" onblur="$.publish('accountChanged',this,event)"/> 
<s:select name="accountList" list="destinationAccounts" 
    onblur="$.publish('accountChanged',this,event)"/> 

以下是JS:

$.subscribe('accountChanged', function(event, data) { 
    alert("New data is: " + data.value); 
    if (event.target.id=='account') { 
     //Do something 
    } 
} 

这里有问题:

  1. 数据。值仅适用于文本框,对于选择框data.value未定义。
  2. 我想知道哪个目标收到事件。 event.target.id不工作!我认为事件对象不是一个jQuery事件对象?

我回顾了示例展示应用程序,但找不到任何。

我是否正确调用$.publish方法?有更好的方法吗?

回答

2

如果您订阅了主题,请将每个标签的主题名称保持为唯一,以允许为标签分隔处理程序。每次在onblur事件中发布主题时都会创建新事件。主题的textfield处理程序如您所描述的那样工作。 select标记不起作用,因为错误的参数作为data传递。的工作代码

<s:textfield name="account" onblur="$(this).publish('accountChanged', this, event)"/> 
<s:select name="accountList" list="{'list1', 'list2','list3'}" onblur="$(this).publish('accountListChanged', this, event)"/> 
<script type="text/javascript"> 
    $.subscribe('accountChanged', function(event, data) { 
    alert("accountChanged: " + data.value); 
    }); 
    $.subscribe('accountListChanged', function(event, data) { 
    alert("accountListChanged: " + data.parentElement.value); 
    }); 
</script> 

正如你可以看到data.value的例子是不确定的,因为data.parentElement.value应该被使用。 event.target.id不工作,因为应该使用event.originalEvent.target.idevent对象是一个jQuery事件,但originalEvent是DHTML对象,它是blur

我不知道你的要求,如果你需要订阅/发布事件或使用原始事件处理程序,我不能说在这种情况下有什么更好的。

+0

要求很简单。 页面中有一个隐藏的文本字段。该隐藏文本的值应设置如下: 如果用户在文本字段中键入一个值,则应该使用文本字段值设置隐藏字段值。 如果用户从选择输入中选择帐户,则应从所选选项中设置隐藏字段值。 我认为当文本框发生变化时以及用户从选择列表中选择一些内容时,我必须发布'accountChanged'主题。这是我发布相同的主题名称的方式。然后在订阅方法中,我想通过读取数据来设置隐藏值。值 –

+0

好吧,你知道该怎么做吗? –

+0

是的!你的回答引导了我很多。我会为其他人提供答案 –

0

下面的代码解决了我的问题:

,因为我无法找到发布/订阅框架的任何例子,我希望下面的例子可以帮助别人!

将JSP是

必须调用${this).publish$.publish

<s:textfield name="account" onblur="$(this).publish('destinationChanged', this, event)"/> 
<s:select name="accountList" list="{'list1', 'list2','list3'}" onblur="$(this).publish('destinationChanged', this, event)" emptyOption="true"/> 
<s:textfield name="destinationAccount" type="hidden" /> 

而且JS会

$.subscribe('destinationChanged', function(event, data) { 
      //If user types in the textbox 
      //then get the value and make the select box shows an empty option 
     if(!!data.value){ 
      destinationAccount= data.value; 
     $('#destinationKnownAccount').val($("#destinationKnownAccount option:first").val()); 
     } else{ 
      //The user selected an account from select box. 
      // So get the value from select box and clean textbox   
      destinationAccount= data.parentElement.value; 
      $('#destinationUnknownAccount').val(''); 
     } 
      //Set the hidden box   
     $('#destinationAccount').val(destinationAccount); 


    }); 

如前所述可以使用event.originalEvent.target.id找到其目标是选择。