JavaScript没有';加载内容异步时无法识别我的函数?
我想在文本上有一个“阅读更多”的点击功能。我正在动态加载特定关键字的Wikipedia文本,并具有以下功能:JavaScript没有';加载内容异步时无法识别我的函数?,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我想在文本上有一个“阅读更多”的点击功能。我正在动态加载特定关键字的Wikipedia文本,并具有以下功能: function setText(text, lang, full) { setTimeout(function () { $('#loading').fadeOut('fast'); }, 300); var mylang = '<?= $_SESSION['lang']; ?>'; if (mylang != 'en' && lan
function setText(text, lang, full) {
setTimeout(function () { $('#loading').fadeOut('fast'); }, 300);
var mylang = '<?= $_SESSION['lang']; ?>';
if (mylang != 'en' && lang == 'en')
var AppendText = '<span class="db f09 grey mt10"><?= __('TEXT_ONLY_ENGLISH'); ?></span>';
console.log(lang);
if (full) {
$('#text').html('<?= __('EMPTY'); ?>');
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
} else if (text) {
// Full Text
function fullText() {
console.log('yes');
setText(text, lang, 1);
}
text = text.length > length ? text.substring(0, length - 3) +
'... <a class="cp" onclick="fullText()"><?= __('MORE') ?></a>' : text;
$('#text').html(text).append(AppendText);
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
}
};
function setText(文本、语言、完整){
setTimeout(函数(){$('#加载').fadeOut('fast');},300);
var mylang='';
if(mylang!=“en”&&lang==“en”)
var AppendText='';
console.log(lang);
如果(完整){
$('#text').html('');
setTimeout(函数(){$('#text').fadeIn('fast');},500);
}如果有的话(文本){
//全文
函数全文(){
console.log('yes');
setText(text,lang,1);
}
text=text.length>length?text.substring(0,长度-3)+
“…”:文本;
$('#text').html(text).append(AppendText);
setTimeout(函数(){$('#text').fadeIn('fast');},500);
}
};
正如您在else if
第一部分中所看到的,将fullText()
函数设置为onclick on the anchor标记。当我点击时,我总是会看到消息全文未定义
。
我只想重新调用相同的setText()
函数,将变量full
设置为1
,这样将显示全文而不是
一些文字。。。(更多)
这在不使用ajax的情况下是可能的吗?我有什么选择
PS:我也尝试调用
setText()
本身,而不是fullText()
,但这也不会被识别为已定义的函数。因为function fullText()
是setText
的本地函数,单击事件在全局范围内执行,并且不知道fullText()
不要使用内部html添加A元素,而是通过createElement
比如:
var hr = document.createElement("A");
hr.className="cp";
hr.onclick= function {
console.log('yes');
setText(text, lang, 1);
}
$('#text').appendChild(hr)
将创建一个闭包并解决问题。因为
函数fullText()
是setText
本地的,单击事件在全局作用域上执行,并且不知道fullText()
不要使用内部html添加A元素,而是通过createElement
比如:
var hr = document.createElement("A");
hr.className="cp";
hr.onclick= function {
console.log('yes');
setText(text, lang, 1);
}
$('#text').appendChild(hr)
将创建一个闭包并解决问题。使用
onclick
属性,您只能引用全局范围内的函数。要解决这个问题,可以动态附加事件处理程序,而不是使用onclick
属性
为了实现这一点,我建议进行一些更改,从而生成以下代码:
function setText(text, lang, full) {
setTimeout(function () { $('#loading').fadeOut('fast'); }, 300);
var mylang = '<?= $_SESSION['lang']; ?>';
// change 1: define an element with jQuery
var $appendText = $('<span>');
if (mylang != 'en' && lang == 'en')
$appendText.addClass('db f09 grey mt10').text('<?= __('TEXT_ONLY_ENGLISH')?>');
console.log(lang);
if (full) {
// change 2: use text(), not html()
$('#text').text('<?= __('EMPTY'); ?>');
} else if (text) {
// Full Text
// Change 3: define link as jQuery element:
var $link = $('<a>');
if (text.length > length) {
text = text.substring(0, length - 3);
$link.addClass('cp').text('<?= __('MORE') ?>');
// Change 4: attach click handler here:
$link.click(function fullText() {
console.log('yes');
setText(text, lang, 1);
});
}
// Change 5: append these jQuery elements, which can be empty:
$('#text').text(text).append($link).append($appendText);
}
// Change 6: move this out of the if-block, as it is the same for both cases:
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
};
function setText(文本、语言、完整){
setTimeout(函数(){$('#加载').fadeOut('fast');},300);
var mylang='';
//更改1:使用jQuery定义元素
变量$appendText=$('');
if(mylang!=“en”&&lang==“en”)
$appendText.addClass('db f09灰色mt10')。text('');
console.log(lang);
如果(完整){
//更改2:使用text(),而不是html()
$('#text')。text('');
}如果有的话(文本){
//全文
//更改3:将链接定义为jQuery元素:
变量$link=$('');
如果(text.length>length){
text=text.substring(0,长度-3);
$link.addClass('cp').text('');
//更改4:在此处附加单击处理程序:
$link.click(函数全文(){
console.log('yes');
setText(text,lang,1);
});
}
//更改5:附加这些jQuery元素,可以为空:
$('#text').text(text).append($link).append($appendText);
}
//更改6:将其移出if块,因为这两种情况相同:
setTimeout(函数(){$('#text').fadeIn('fast');},500);
};
请注意,您没有提供变量
length
的定义,但我假设它对函数可用。使用onclick
属性,您只能引用全局范围内的函数。要解决这个问题,可以动态附加事件处理程序,而不是使用onclick
属性
为了实现这一点,我建议进行一些更改,从而生成以下代码:
function setText(text, lang, full) {
setTimeout(function () { $('#loading').fadeOut('fast'); }, 300);
var mylang = '<?= $_SESSION['lang']; ?>';
// change 1: define an element with jQuery
var $appendText = $('<span>');
if (mylang != 'en' && lang == 'en')
$appendText.addClass('db f09 grey mt10').text('<?= __('TEXT_ONLY_ENGLISH')?>');
console.log(lang);
if (full) {
// change 2: use text(), not html()
$('#text').text('<?= __('EMPTY'); ?>');
} else if (text) {
// Full Text
// Change 3: define link as jQuery element:
var $link = $('<a>');
if (text.length > length) {
text = text.substring(0, length - 3);
$link.addClass('cp').text('<?= __('MORE') ?>');
// Change 4: attach click handler here:
$link.click(function fullText() {
console.log('yes');
setText(text, lang, 1);
});
}
// Change 5: append these jQuery elements, which can be empty:
$('#text').text(text).append($link).append($appendText);
}
// Change 6: move this out of the if-block, as it is the same for both cases:
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
};
function setText(文本、语言、完整){
setTimeout(函数(){$('#加载').fadeOut('fast');},300);
var mylang='';
//更改1:使用jQuery定义元素
变量$appendText=$('');
if(mylang!=“en”&&lang==“en”)
$appendText.addClass('db f09灰色mt10')。text('');
console.log(lang);
如果(完整){
//更改2:使用text(),而不是html()
$('#text')。text('');
}如果有的话(文本){
//全文
//更改3:将链接定义为jQuery元素:
变量$link=$('');
如果(text.length>length){
text=text.substring(0,长度-3);
$link.addClass('cp').text('');
//更改4:在此处附加单击处理程序:
$link.click(函数全文(){
console.log('yes');
setText(text,lang,1);
});
}
//更改5:附加这些jQuery元素,可以为空:
$('#text').text(text).append($link).append($appendText);
}
//更改6:将其移出if块,因为这两种情况相同:
setTimeout(函数(){$('#text').fadeIn('fast');},500);
};
请注意,您没有提供变量
length
的定义,但我假设它对函数可用。编辑:上面的其他答案更好,因为它们利用了jQuery,并且更有意义;我的部分解决方案(仅我所做的编辑)不依赖于jQuery
试着这样做:
var fullText;
function setText(text, lang, full) {
setTimeout(function () { $('#loading').fadeOut('fast'); }, 300);
var mylang = '<?= $_SESSION['lang']; ?>';
if (mylang != 'en' && lang == 'en')
var AppendText = '<span class="db f09 grey mt10"><?= __('TEXT_ONLY_ENGLISH'); ?></span>';
console.log(lang);
if (full) {
$('#text').html('<?= __('EMPTY'); ?>');
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
} else if (text) {
// Full Text
fullText = function() {
console.log('yes');
setText(text, lang, 1);
}
text = text.length > length ? text.substring(0, length - 3) +
'... <a class="cp" onclick="fullText()"><?= __('MORE') ?></a>' : text;
$('#text').html(text).append(AppendText);
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
}
};
编辑:上面的其他答案更好,因为它们利用了jQuery,并且更有意义;我的部分解决方案(仅我所做的编辑)不依赖于jQuery 试着这样做:
var fullText;
function setText(text, lang, full) {
setTimeout(function () { $('#loading').fadeOut('fast'); }, 300);
var mylang = '<?= $_SESSION['lang']; ?>';
if (mylang != 'en' && lang == 'en')
var AppendText = '<span class="db f09 grey mt10"><?= __('TEXT_ONLY_ENGLISH'); ?></span>';
console.log(lang);
if (full) {
$('#text').html('<?= __('EMPTY'); ?>');
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
} else if (text) {
// Full Text
fullText = function() {
console.log('yes');
setText(text, lang, 1);
}
text = text.length > length ? text.substring(0, length - 3) +
'... <a class="cp" onclick="fullText()"><?= __('MORE') ?></a>' : text;
$('#text').html(text).append(AppendText);
setTimeout(function () { $('#text').fadeIn('fast'); }, 500);
}
};
与你的工作无关