为什么用AJAX加载内联JavaScript内部视图很糟糕?
我们有一个选项卡式界面,其中一个选项卡内有一个隐私表单。此隐私表单,以及在其大部分工作中使用外部JavaScript文件,也使用内联JavaScript,因为它目前依赖于动态代码(服务器端语言) formTabs包装器(不带回调函数的ajax选项卡)为什么用AJAX加载内联JavaScript内部视图很糟糕?,javascript,xml,ajax,platform-agnostic,Javascript,Xml,Ajax,Platform Agnostic,我们有一个选项卡式界面,其中一个选项卡内有一个隐私表单。此隐私表单,以及在其大部分工作中使用外部JavaScript文件,也使用内联JavaScript,因为它目前依赖于动态代码(服务器端语言) formTabs包装器(不带回调函数的ajax选项卡) 。。。 var messagingTabset=ProjectName.Tabset.init({ “选项卡ID”:“首选项选项卡集”, “ajaxUrl0”:“, “ajaxUrl1”:“, “ajaxUrl2”:“, “ajaxUrl3”:“,
。。。
var messagingTabset=ProjectName.Tabset.init({
“选项卡ID”:“首选项选项卡集”,
“ajaxUrl0”:“,
“ajaxUrl1”:“,
“ajaxUrl2”:“,
“ajaxUrl3”:“,
“ajaxUrl4”:“,
“ajaxUrl5”:“,
“defaultAjaxUrl”:”
});
...
privacyForm视图(更多带有服务器端代码的内联javascript)
。。。
var preferencesPrivacyForm=newprojectname.AJAX.Form({
“ajaxFormID”:“首选项隐私表”,
“actionUrl”:“”,
“dataReturnType”:“json”
});
...
后端开发人员:“此表单的配置JavaScript代码应保留在privacyForm视图中”
前端开发人员:“嗯,我确信我已经读到了,这不是实现这一点的方法-不可靠,所有JavaScript都应该在包含选项卡包装的HTML页面中,在选项卡加载的回调函数中。你真的应该a)为我提供逻辑,在标签包装器中获取动态数据,或者b)让我通过DOM遍历获取这些动态变量”
后端开发人员:“这两种方法都是大量的工作,没有真正的回报!第一个例子很糟糕,因为它意味着我必须改变它的构建方式(并且工作正常)。这可能意味着重复。第二个例子是不可靠的,因为标记可能会更改,因此处理代码的人可能会忘记在tabs包装器中编辑DOM遍历方法。这是我们不需要的另一个抽象层次。如果你能为我提供一些证据,说明为什么这真的很糟糕,我会查一查,但除此之外,我无法证明投入时间是合理的。”
前端开发人员:“好吧,我已经浪费了几天时间,通过将AJAX加载的JavaScript放在包装器的回调中来解决问题,但是现在你想想,关于这类事情的一个好的参考资料会非常好,因为你是对的,目前,应用程序运行没有任何问题女士’
这是整个大型应用程序中的许多示例之一,我们正在使用Ajax加载内联JavaScript
我应该说服后端开发人员我们应该使用回调,还是我遗漏了什么?我建议阅读戴尔·卡内基的《如何赢得朋友和影响他人》 开发人员似乎经常陷入这种情况,他们知道什么是最好的做法,但他们没有得到其他开发人员或管理层的认可 这本书绝对值得一读;绝对是这个行业的必读之作。只要它有目的(例如,它从WordPress dashboard等其他网站加载内容),它就不是真正的“坏”,但是,除非你必须这样做,否则对服务器进行所有额外的调用都是浪费资源
通常,最简单的答案是最正确的答案。在这种情况下,这意味着不要增加所有额外的开销,以避免对后端进行轻微的重新编码。从示例中不清楚为什么首先需要AJAX。为什么不把
<script type ="text/javascript">
var userId = "<<<<= userId >>>>"
</script>
var userId=“”
直接进入HTML头部?这对用户来说更快,在服务器上更容易,并且您可以避免对失败请求进行计时和错误处理的所有痛苦。这是为什么使用不引人注目的Javascript(UJS)的核心论点很好。我从未理解它的优点,因为我不知道如何在没有内联Javascript的情况下解决问题。我最终学会了 首先,UJS很好,因为它将前端代码分离如下:
...
<script type = "text/javascript">
var preferencesPrivacyForm = new ProjectName.AJAX.Form({
"ajaxFormID": "preferences-privacy-form",
"actionUrl": '<%= Url.Action("SavePrivacy","Profile") %>',
"dataReturnType":"json"
});
</script>
...
<script type ="text/javascript">
var userId = "<<<<= userId >>>>"
</script>