Yii2 Pjax 和 ActiveForm beforeSubmit 重新加载后不起作用?

2023-12-14

我正在提交按钮上创建一个加载指示器,并使用 registerJs 函数将“开始”过程附加到 beforeSubmit 事件。

第一次它可以正常工作,但是在重新加载 Pjax 容器后,再次提交表单时该事件将不会触发。

我将整个视图文件包含在 Pjax 容器中,以便正确显示 Flash 消息。

这是 main.php 布局文件片段:

<?php Pjax::begin([
'id' => 'pjax-container',
'enablePushState' => false,
]); ?>

<?= Alert::widget(); ?>

<?= $content; ?>

<?php Pjax::end(); ?>

这是 registerJs 函数,位于 main.php 的以下部分:

<?php
$js = <<< 'SCRIPT'
$('#form').on('beforeSubmit', function(){
alert('Submitted...');
//$("#spinner").fadeIn();
});
SCRIPT;
$this->registerJs($js);
?>

这是 activeForm:

<?php $form = ActiveForm::begin(['id' => 'form', 'options' => ['data-pjax' => true]]); ?>

<?= $form->field($model, 'name')->textInput(['type' => 'text']) ?>

<?= $form->field($model, 'email')->textInput(['type' => 'email']) ?>

<?= $form->field($model, 'subject')->textInput(['type' => 'text']) ?>

<?php
echo $form->field($model, 'message')->textArea(['rows' => 6]);

echo $form->field($model, 'verify_code')->widget(Captcha::className(), [
        'captchaAction' => 'site/captcha',
        'template' => '<div class="row"><div class="col-lg-4">{image}</div><div class="col-lg-6">{input}</div></div>',
]);
?>

<button class="btn btn-success">
<span id="spinner" style="display: none; float:left; margin-right: 26px;">
<?php
echo Spinner::widget([
'pluginOptions' => [
    'top' => '50%',
    'left' => '10px',
    'lines' => 11,
    'length' => 5,
    'width' => 3,
    'corners' => 1,
    'trail' => 100,
    'speed' => 1.25,
    'radius' => 4,
],
]);
?>
</span>
<?php echo $model->isNewRecord ? 'Send Message' : 'Update'; ?>
</button>

<?php ActiveForm::end(); ?>

我正在使用 Kartik Spinner 小部件(详细信息和演示)

关于为什么在 Pjax 成功提交后加载数据容器后 beforeSubmit 事件不会触发的任何想法?

Thanks.


出现此问题的原因有多种。

首先,放置在其中的任何代码$(document).ready();而加载在ajax调用的页面(包含页面)加载后不会被执行。

其次,对外部脚本的任何引用(<script src>) 不保证在内联脚本之前加载。在 Yii2 的情况下,这些内联脚本将被注册registerJs()

让 Pjax 能够很好地加载复杂的脚本相关页面是not琐碎的。

有几件事可以解决您的问题:

1)内联脚本加载registerJs()并设置为POS_READY(默认?)将包含在$(document).ready()如果视图是通过渲染的render().

因此,通过渲染非常重要renderAjax()。这将确保内联脚本能够运行。

有时(大多数时候)你需要使用render()当静态加载和renderAjax()当 pjax 加载页面时。在您的实例中,为了将 Pjax 小部件放置在布局中,这是必需的。对于这些情况,您可以使用以下代码:

if(Yii::$app->request->getHeaders()->has('X-PJAX'))
{
    return $this->renderAjax('myview');
}
else
{
    return $this->render('myview');
}

2)当编写您知道将在 pjax 调用的上下文中加载的外部脚本时。使用:

$(document).on('ready pjax:success', function(){
    // ...
});

这将正确加载脚本。但请记住,每次 Pjax 调用成功时,它都会重新加载/重新绑定脚本。不幸的是,这可能不是我们所希望的。

另请记住,pjax:success加载包含的页面中的外部脚本后,事件不一定会触发。参见 3)

3)要解决脚本顺序问题,您需要从 pjax.js 脚本中删除以下行:

obj.scripts = findAll(obj.contents, 'script[src]').remove() 

但是,这会导致设置为禁用的浏览器出现问题eval()(这就是为什么这条线首先存在的原因)

Pjax 最终会解决这个问题。您可以跟踪进度here

如果有任何不清楚的地方请告诉我,我会重新表述。

UPDATE:Yii 2.0.7 引入了一些变化。其中之一是更新bower\yii2-pjaxto 2.0.6。这说明了一点3)不再需要并说明问题2)虽然不太重要,但了解它仍然是一件好事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii2 Pjax 和 ActiveForm beforeSubmit 重新加载后不起作用? 的相关文章

随机推荐

  • WooCommerce - 重命名和使用重命名的订单状态

    我已经使用此代码将我的订单状态 已完成 重命名为 已付款 function wc renaming order status order statuses foreach order statuses as key gt status ne
  • facebook 从 cookie php 自动重新登录

    我的网站使用 Facebook connect 登录 服务器上的会话生命周期为 3600 我在用着客户端流程 javascript 重定向到login php login php检索cookie 由javascript设置 以获取访问令牌
  • 覆盖 Outlook 暗模式按钮背景

    我正在尝试向我的电子邮件模板添加对暗模式的支持 但是在 Outlook 方面遇到问题 由于某种原因 Outlook 部分覆盖了我的按钮的背景 导致其显示不正确 该按钮的 HTML 如下 td align center style font
  • WP-Query :检查帖子内容是否为空

    我正在尝试检查我的帖子是否有循环内容 目前 我在循环中添加了一个条件 if post gt post content 并将参数放入 wp query posts per page gt 8 我以为这有效 但实际上 WP query去找最后一
  • 使用 Gnome 库 (GDK) 获取键盘修饰符状态仅获取初始状态

    我正在尝试通过 gnome GDK 或 GTK 库获取当前的键盘修饰符状态 目的是实现显示该状态的可访问性 gnome shell 扩展 我知道如何使用 xlib 获取其状态 但 gnome gjs 没有完全绑定 下面的代码仅获取初始状态
  • Powershell 脚本根据修改日期复制文件以从远程位置检查最新文件

    我是 powershell 脚本编写的新手 我不明白为什么我的脚本会复制 所有文件 似乎没有检查日期 然后复制所有文件 反正 我也尝试过几天和几分钟 但我不太确定 关于如何做到这一点 任何帮助都会很棒 see my script below
  • Python 类与另一个类在同一文件中定义 - 如何访问文件中稍后定义的类?

    我对Python很陌生 我认为这个问题应该很容易回答 我的问题简化了是这样的 我在文件类 A 和类 B 中有 2 个类 类 A 在文件中首先定义 类 B 在第二个定义 class A class B 如何通过 A 类访问 B 类 class
  • 如何检索列表框中所选项目的选定值?

    我正在 WinForms 应用程序中填充列表框 如下所示 listBoxUsers DataSource ctx Users ToList listBoxUsers DisplayMember Name listBoxUsers Value
  • 检查表中是否包含列表中的值

    我有一个字符串参数列表 我想编写一个查询 返回一个字符串列表 其中包含表中存在的参数列表的值 我有以下查询 但无法获取 where 子句 List
  • 我如何在 Slick2D/LWJGL 或一般游戏编程中使用“delta”?

    我所知道的是 增量在某种程度上与适应不同的帧速率有关 但我不确定它到底代表什么以及如何在计算速度和不计算速度的数学中使用它 Delta 在哪里声明 初始化 它是如何使用的 它的值 最小值 最大值 是如何设置的 它是帧之间的毫秒数 您不想尝试
  • 如何检测 tcp 客户端与 gen_tcp 的断开连接?

    我正在尝试使用 gen tcp 模块 有服务器端代码的示例 我遇到了麻烦 First I bind server port and wait for peer connection ok Sock gen tcp listen 7890 a
  • 有没有办法防止空值被保留,同时允许其他值通过?

    我有一个现有的 JPA EclipseLink 项目 其中所需的行为是 如果在实体的字段中给出空值 则不应保留该空值 用例是我们可以从外部来源获得这些实体的一些部分更新 这些来源可能会给我们一个空值 这并不意味着 使该字段无效 而是意味着
  • Android Espresso 测试应用流程

    我使用 Espresso 来测试很多活动以及它们之间的转换 我想为这些活动编写不同的测试 并将活动意图链接到相应的测试用例 1 活动 A testActivityA 运行 2 应调用活动启动器活动B testActivity B 是否可以使
  • 如何设置禁用 DIV 元素的样式

    我可以让输入元素响应 hover and hover disable 但看起来 div 的反应不一样 btn width 99px border color 2px 787878 background color CACACA margin
  • 如何对部署在 Tomcat 上的 Jersey Web 应用程序进行单元测试?

    我正在构建部署在 Tomcat 上的 Jersey Web 应用程序 我很难理解如何对应用程序进行单元测试 通过简单地实例化我的测试中的类并调用它们的方法 这与 Jersey 或 Tomcat 无关 可以测试核心业务逻辑 非 Jersey
  • 在不同函数中使用字符串名称

    我需要使用movies list从第二个函数中的第一个函数开始 我怎么做 def movie movies list movie strip for movie in movies list movie explorer def rand
  • laravel 4 雄辩的热切加载关系计数

    我有一个具有多个定义关系的复杂模型 在这个例子中我想计算Like模型并创建一个名为likes因此它可以从 REST 服务返回 是否可以将模型计数加载到动态属性中 beat Post with array user likes gt func
  • 如何将字体与我的 .net winforms 应用程序捆绑在一起?

    我想为我的 net 3 0 Winforms 应用程序使用非标准字体 该字体可能安装在我的某些用户的计算机上 但在其他一些计算机上显然会丢失 如何将字体与我的程序一起发送 我需要安装字体吗 如果是这样 缺乏管理员权限会成为问题吗 您必须使用
  • html标签“/href”和navlink或Link之间的区别

    html标签 href 和react router提供的用于导航页面的navlink有什么区别 我可以使用两者来将页面导航到不同的 URL 那么为什么需要引入 Navlink 或 Link The href属性将触发页面刷新 从而重置应用程
  • Yii2 Pjax 和 ActiveForm beforeSubmit 重新加载后不起作用?

    我正在提交按钮上创建一个加载指示器 并使用 registerJs 函数将 开始 过程附加到 beforeSubmit 事件 第一次它可以正常工作 但是在重新加载 Pjax 容器后 再次提交表单时该事件将不会触发 我将整个视图文件包含在 Pj