Yii2退出链接电脑端POST正常移动端发GET报405如何解决
请求方式和屏幕尺寸没有直接关联,问题出在响应式布局下的DOM结构或事件绑定逻辑,常见原因和对应解决方案如下:
- 最高概率原因:你的项目响应式导航做了两套DOM,桌面端显示一套,移动端汉堡菜单显示另一套,两套DOM在不同屏幕尺寸下分别切换显示/隐藏。你仅给桌面端的退出按钮加了
data-method属性,移动端的退出按钮是单独编写的,没有对应属性,点击时就会默认发送GET请求触发405错误。
排查方法:切换到移动端模拟状态,用开发者工具选中退出按钮,检查对应元素是否存在data-method="post"属性,同时查看是否存在另一个被隐藏的桌面端退出按钮元素。
解决方案:给移动端导航的退出按钮也添加相同的data-method配置即可。 - 如果确认只有一套退出按钮DOM、属性完整,那就是移动端导航是页面加载完成后通过JS动态插入的,Yii自带的
yii.js默认只给页面初始化时已存在的元素绑定data-method对应的点击事件,动态插入的元素不会触发绑定逻辑。
解决方案:在公共JS文件中添加全局事件委托绑定,代码如下:// 需保证在yii.js加载完成后执行 $(document).on('click', 'a[data-method]', function (e) { yii.handleAction($(this), e); }); - 最稳妥的兼容方案(完全不依赖JS事件绑定,规避所有类似问题):
直接把退出按钮改成表单提交形式,Yii官方也更推荐这种写法,不会因为JS加载异常、DOM动态生成等问题导致提交方式错误,你可以根据自己的实际样式需求调整submitButton的class,去掉按钮默认样式和a标签保持一致即可:<?= Html::beginForm(['/site/logout'], 'post', ['class' => 'd-inline']) ?> <?= Html::submitButton('Logout', [ 'class' => ['icon', 'icon fa-times', 'btn btn-link p-0 border-0'], 'title' => 'Logout' ]) ?> <?= Html::endForm() ?>
内容的提问来源于stack exchange,提问作者Tornol394
相关产品推荐
相关产品推荐

