【问题标题】:Send a callback function from JSP var to Javascript从 JSP var 向 Javascript 发送回调函数
【发布时间】:2016-02-22 22:59:14
【问题描述】:

我遇到了关于使用回调函数的 javascript 方法的问题。 我有一个 jsp,我在其中定义了要调用的回调函数。

 <c:set var="callbackMethod" value="dispatchRFQDocument.loadDocumentGroup" scope="request"/>

然后从下一个 JSP 如果我从 onClick 调用该回调,一切都会像魅力一样工作。

 <a id="documentComponentLinkId"
   href="javascript:void(0);" onclick="documentDialog.openDocumentsDialog(${callbackMethod})">
    <i id="documentsDialog" class="fa fa-folder-open-o">
        <spring:message code="label.procurement.stopProcedure.documents"/>
    </i>
</a>

但是,我不想使用 onClick 事件,而是想在我的 Javascript 上绑定事件并在那里调用回调。回调方法不能再被调用,因为它是一个字面量。

在我的 JSP 中

   <script>
         var callbackMethod = "${callbackMethod}";
   </script>

在 Javascript 中

var initListener = function () {
    $('#documentComponentLinkId').click(function () {
        documentDialog.openDocumentsDialog(callbackMethod);
    });
};

有什么建议吗?

问候。

【问题讨论】:

  • 只是为了测试,写一个alert(dispatchRFQDocument.loadDocumentGroup);来确保你的方法存在,然后再传递给init监听器。
  • 我做了并且 alert(callbackMethod) return "dispatchRFQDocument.loadDocumentGroup" 问题是,当我声明为变量时不再是一个函数
  • 保罗,你不懂。暂时忘记 JS 变量,因为这只是一个字符串。为了让这个东西最终工作dispatchRFQDocument.loadDocumentGroup 必须存在(不是作为字符串,而是)作为 JS 函数对象。所以,当我问你alert(dispatchRFQDocument.loadDocumentGroup); 时,我的意思是准确地写出来,因为似乎该函数不存在并且会输出[undefined]。你需要先解决这个问题。

标签: java javascript jquery jsp


【解决方案1】:

您可以像以前一样将回调方法直接传递给openDocumentsDialog()

var initListener = function () {
    $('#documentComponentLinkId').click(function () {
        documentDialog.openDocumentsDialog(${callbackMethod});
    });
};

【讨论】:

  • 不定义js变量?这怎么可能?,如果我像以前一样定义变量,我有这个错误“错误回调()不是函数”
  • 好吧,在定义initListener 之前,您确定dispatchRFQDocument.loadDocumentGroup 存在吗?而且,不,没有必要为赋值声明一个 JS 变量。
  • 这不是 Javascript 可以理解的语法 ${callbackMethod}。我在这里错过了什么?谢谢
  • 当浏览器接收到该 JSP 文件时,${callbackMethod} 将已经被实际的 JS 函数调用替换。这将在 HTML 响应发送到浏览器之前在服务器上发生。这就是 JSP 的工作方式,所以没有问题。是的,您的 IDE 可能会抱怨语法高亮问题,因为 JS 不理解 {},但所有这些都像模板文件一样工作,最终在浏览器上呈现(在占位符值 ${} 被替换后)确定它是否语法是否正确。
【解决方案2】:

您正在将变量 callbackMethod 设置为字符串。

实际上,您必须将其设置为函数定义,而不是这样做。

我认为下面应该可以正常工作:

var callbackMethod = dispatchRFQDocument.loadDocumentGroup

【讨论】:

  • 好的,但问题是我需要将此变量从页面传递到另一个页面。我正在使用模块模式,变量必须是页面的一部分。我不能在我的 js 中使用在包含 var 的页面之外定义的 var。而这个页面是一个通用组件
  • 粘贴不起作用 ReferenceError: dispatchRFQDocument is not defined var callbackMethod = dispatchRFQDocument.loadDocumentGroup
  • 首先您必须确保所需的方法存在于给定的范围内。如果没有,那么您必须通过模块的特权方法访问该方法(如果是私有的)。
  • 模块的内部特权方法可以在其静态范围内访问其私有变量和私有方法。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多