草庐IT

php - 在 Yii Framework 中移动结束 BODY 标记之前的所有 JS?

coder 2024-04-23 原文

一段时间以来,我一直在努力弄清楚如何做到这一点,但被难住了。出于某种疯狂的原因,YII 违背了最佳实践,并试图将所有这些 JS 插入 HEAD 标签和整个主体中。我希望所有 JS 都出现在结束 body 标记之前。

我正在使用自己的 jQuery (v.1.9.0)、Bootstrap 等,并将 scriptMap 设置为 false。然而,yiiactiveform 仍然被插入到 HEAD 标签中,并且在我使用 enableClientValidation 的 View 中使用的 JS 以及在我的 View 底部编写的 JS 仍然显示在 BODY 中。

如何改变?

最佳答案

jquery.yiiactiveform.jsregistered as a coreScript ,所以要改变它的位置,你必须覆盖它的位置,这是 default is the <HEAD> .要覆盖您可以使用的位置 coreScriptPosition property of CClientScript ,有点像(在您的特定观点中):

Yii::app()->clientScript->coreScriptPosition=CClientScript::POS_END;

我们刚刚将其更改为定位在 body 标签的末尾。

但由于您想对所有 View (即整个应用)执行此操作,因此您可以在应用配置期间覆盖该位置。为此,您必须更改由应用程序加载的配置数组,通常此数组在文件中指定:protected/config/main.php。您必须更改 clientScript应用程序的组件配置,如下所示:

return array(
    // other properties
    'components'=>array(
        // other components' configurations

        'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END
        )
    )
);

同样,您可以对注册为脚本文件的脚本进行更改,即使用 registerScriptFile() , 使用 property defaultScriptFilePosition .

然后对于使用 registerScript() 注册的脚本使用 property defaultScriptPosition .

当你想为小部件注册的脚本指定位置时,这些属性特别方便,比如 CActiveForm,当然当你想为你自己的脚本指定位置时(如果使用 registerScript* 函数之一注册)。

如果您自己指定了文件/脚本(使用 registerScript* 函数之一),那么您也可以在调用函数时设置位置。

当你改变小部件的位置时一定要彻底测试,例如 CActiveForm 有一些在 jQuery.ready 中注册的小脚本。函数或 jQuery(function($) { ... ,如果您将 defaultScriptPosition 指定为 POS_END,这些脚本将移出 ready()功能。

您可以为每个 View 再次更改这些属性:

Yii::app()->clientScript->defaultScriptPosition=CClientScript::POS_END;
Yii::app()->clientScript->defaultScriptFilePosition=CClientScript::POS_END;

或系统范围内:

return array(
    // other properties
    'components'=>array(
        // other components' configurations

        'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END,
            'defaultScriptPosition'=>CClientScript::POS_END,
            'defaultScriptFilePosition'=>CClientScript::POS_END
        )
    )
);

如果您已将脚本包含在 <script></script> 中在您的 View 中添加标签,那么恐怕您无法轻易控制它们的位置,您将不得不将这些脚本(如果可能)移动到布局文件中(并非始终有效 - 许多不同的情况)。最好的选择是切换到 registerScriptFile , 或 registerScript 函数,而不是使用 <script> .

关于php - 在 Yii Framework 中移动结束 BODY 标记之前的所有 JS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14616545/

有关php - 在 Yii Framework 中移动结束 BODY 标记之前的所有 JS?的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  3. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  4. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  5. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  6. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  7. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  8. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  9. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  10. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

随机推荐