【发布时间】:2017-10-13 02:50:03
【问题描述】:
我正在尝试优化我在 phpBB3 上的“剧透”bbcode。
现在,我有一个可行的解决方案,但每次使用“spoiler”bbcode 标签时,phpBB 都会注入内联 javascript。我想调用一个通用函数,而不是每次使用 bbcode 时都内联添加。
这是工作的内联javascript:
<div class="spoiler">
<div class="spoiler-title">
<span onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.parentNode.getElementsByTagName('a')[0].innerText = 'hide'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.parentNode.getElementsByTagName('a')[0].innerText = 'show'; }">
<strong>{TEXT1}</strong> (<a href="#" class="spoiler-btn" title="Show hidden content">show</a>)
</span>
</div>
<div class="spoiler-text">
<div style="display: none;">
{TEXT2}
</div>
</div>
</div>
为了阅读方便,这里重复一下内联的onclick函数:
if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') {
this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = '';
this.parentNode.getElementsByTagName('a')[0].innerText = 'hide';
} else {
this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none';
this.parentNode.getElementsByTagName('a')[0].innerText = 'show';
}
单击“spoiler-btn”类的锚点有一个preventDefaults,以防止单击将您带到页面顶部:
$(document).ready(function(){
$(".spoiler-btn").click(
function(e) {
e.preventDefault();
}
);
});
我试图将 span onclick 内联 javascript 替换为将“this”传递给外部 javascript 文件的函数调用。我似乎无法让它工作,所以我尝试使用 jQuery 来捕获“this”以遍历 DOM 以找到包含在“spoiler-text”div 中的“div”并操纵 display:none。页面上可以有多个这样的剧透标签,所以我不能给“剧透文本”div 中的 div 一个 id。
这里我把span的onclick改成了外部函数:
onclick="spoilerToggle(this);"
然后我的外部文件中有以下内容:
var spoilerToggle = function(param) {
if ($(this).parent('div').parent('div').hasClass('spoiler-text').css('style') == 'none') {
($(this).parent('div').parent('div').hasClass('spoiler-text').removeAttr('style'));
($(this).parent('div').$('a').text('hide'));
} else {
($(this).parent('div').parent('div').hasClass('spoiler-text').css('display', 'none'));
($(this).parent('div').$('a').text('show'));
}
}
然后控制台给出以下错误: bbcode.js:22 Uncaught TypeError: $(...).parent(...).parent(...).hasClass(...).css is not a function
第 22 行是带有“if”检查的行。
jQuery 已加载到网站上,并且我确保在 body 标记关闭之前调用我的外部 javascript 文件。
我觉得我已经掉进了兔子洞,看不到光了。我确信这比我想象的要容易得多。
非常感谢任何帮助。谢谢!
【问题讨论】:
标签: javascript jquery html css