Php 将javascript放在何处以及如何处理事件

Php 将javascript放在何处以及如何处理事件,php,javascript,frameworks,Php,Javascript,Frameworks,长期以来,我一直在寻找一种实用的(可重用、清晰、可更新的……)解决方案,以解决以下问题: 我开发了自己的PHP框架,它使用“小部件”——UI的可重用部分。小部件可以通过ajax请求进行更新 每个小部件都是一个简单的PHP类,其方法名为Content(),生成HTML输出 几乎所有小部件都包含JavaScript。它用于处理特定小部件中的事件 尽管一切都很好,但我对JS的使用方式并不满意。以下是一些主要问题: 当使用Ajax刷新小部件时,所有小部件数据(HTML)连同所有Javascript

长期以来,我一直在寻找一种实用的(可重用、清晰、可更新的……)解决方案,以解决以下问题:

  • 我开发了自己的PHP框架,它使用“小部件”——UI的可重用部分。小部件可以通过ajax请求进行更新
  • 每个小部件都是一个简单的PHP类,其方法名为Content(),生成HTML输出
  • 几乎所有小部件都包含JavaScript。它用于处理特定小部件中的事件
尽管一切都很好,但我对JS的使用方式并不满意。以下是一些主要问题:

  • 当使用Ajax刷新小部件时,所有小部件数据(HTML)连同所有Javascript(BAD)一起传输到客户端(OK)(但是在99%的情况下JS没有改变)
  • 最终的HTML标记与javascript调用和事件处理程序混合在一起
  • 很难管理所有嵌入式JS
  • 浏览器不能以这种方式缓存JS
我想问的是您对在大型php框架中使用Javascript的看法/建议

最近,我在考虑在widget类(比如function Script())中编写一个单独的方法,其中我将放置所有的JS代码,然后遍历所有的widget,将所有的JS代码放在一个.JS文件中,直到其中一个widget发生更改为止。你认为这种方法怎么样


谢谢

我会将不同小部件使用的javascript文件放在不同的映射中,并静态加载它们(必须更快,如果设置正确,还需要自动浏览器缓存)


然后,根据您的框架的动态程度,我将制作某种加载程序javascript,它只自动获取和加载当前加载到页面上的小部件所需的JS文件。您需要在脚本中打印的可能只是某种require_js_file函数,它将告诉加载程序这个小部件使用哪个javascript,并且加载程序将获取它,但前提是它尚未加载(例如,如果这不是小部件的第一次运行).

您试图实现的目标与我在使用敏捷工具包时面临的相同

-向下滚动至通过AJAX请求加载表单/网格的示例。它正是您想要做的——将一个小部件与JavaScript一起加载,并只执行必要的操作

我面临的困难是: -加载和执行javascript。我必须编写自己使用的处理程序。它是在$.ajax之上构建的。诸如会话过期、多次用户点击、缓慢加载等都在这一层中处理。 -框架需要控制JavaScript。为此,我使用jQuery链。它基本上创建了一个可以附加到任何小部件(或我们行话中的视图)的对象,并且只有当小部件也在渲染时才会在输出中公开。当您进行部分重新加载时,应该只显示相关的JS

因此,您的脚本方法与我的js()函数完全相同:

当然,我的观点是,以这种方式抽象视图并分离JavaScript是一种很好的方法。我在丰富的网站上看到过如此多的AJAX故障,例如在AmazonEC控制台、Github等中,而在我们在AgileToolkit中构建的软件中,这些故障都没有发生。即使在开发中,所有javascript的行为也非常合理和可预测

我们完全用AJAX构建了一个在线完整的会计软件。人们使用它几个小时而没有一个页面刷新。许多jQuery插件必须转换为WidgetFactory才能正确地自毁。开发这样的软件简直太神奇了