Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript没有';加载内容异步时无法识别我的函数?_Javascript_Jquery_Asynchronous - Fatal编程技术网

JavaScript没有';加载内容异步时无法识别我的函数?

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

我想在文本上有一个“阅读更多”的点击功能。我正在动态加载特定关键字的Wikipedia文本,并具有以下功能:

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);
    }
};
与你的工作无关