异步数据加载后的jQuery Execute函数

时间:2018-12-07 12:59:47

标签: javascript jquery dom ecmascript-6 yandex-api

我创建了一个jQuery函数,扩展了自己的对象$。此函数转换附加到元素this上的那些元素:

$.fn.extend({
  translate: function(sourceLang, targetLang) {
    if($(this).text().trim().length < 1 || !isNaN(parseInt($(this).text().trim())) || sourceLang == targetLang)
      return;

    let $function = this;

    $($function).each(function() {
      let $each = this;
      $.ajax({
        url: 'https://translate.yandex.net/api/v1.5/tr.json/translate',
        method: 'GET',
        dataType: 'JSONP',
        crossDomain: true,
        data: {
          key: /* my-secret-key */,
          text: $($each).text(),
          lang: sourceLang + '-' + targetLang
        },
        success: function(response) {
          try {
            if(response.code !== 200)
              throw "Response: " + response.code;
            $($each).text(response.text[0])
          } catch(error) {
            console.error('Translation error on element: ', $($function).text());
            console.error('Message returned by the server:', error);
          }
        },
        error: function(xhr, status, error) {
          console.error('Translation error on element: ', $($function).text());
          console.error('Message returned by the server:', xhr.responseText);
        }
      });
    });
  }
});

加载代码后,我这样做:

$(document).ready(function() {
    let lang = $('html').attr('lang').split('-')[0];
    $('td td:visible').translate(lang, "en");
}); 
  

注意:根据所记录的用户语言,HTML标签看起来像这样<html lang="es-ES">

我遇到的问题是表在几秒钟后加载(因为我们不在生产环境中,所以它们可能超过30)。因此,前面的代码块没有用。

  

注意:在添加数据时会创建<tbody>标签。

我尝试过的是:

1。。当setInterval()大于0时,创建一个clearInterval()$('td:visible').length

let iv = setInterval(function() {
    let lang = $('html').attr('lang').split('-')[0];
    let rows = $('tbody td:visible');
    if(rows.length > 0) {
        rows.translate(lang, "en");
        clearInterval(iv);
    }
}, 1000);

2。。在翻译前设置.delay()

let isTranslated = false;
while(!isTranslated) {
    let lang = $('html').attr('lang').split('-')[0];
    let rows = $('tbody td:visible');
    if(rows.length > 0) {
        rows.delay(1000).translate(lang, "en");
        isTranslated = true;
    }
}

浏览器消耗的内存大于200MB。我也尝试过使用$('table').on('DOMSubstreeModified', 'tbody', function() {}),但是没有用。

那么,您建议在加载表体后在此表上使用此翻译插件的方法是什么?

编辑1:

由于@ lucifer63的建议,我已经更改了代码,因此我执行的API请求更少:

let $function = this;
let collection = [];
let translation = '';
$(this).each(function() {
  collection.push($(this).text());
});
let text = collection.join('::');

$.ajax({
  url: 'https://translate.yandex.net/api/v1.5/tr.json/translate',
  method: 'GET',
  dataType: 'JSONP',
  crossDomain: true,
  data: {
    key: /* my-secret-key */,
    text: text,
    lang: sourceLang + '-' + targetLang
  },
  success: function(response) {
    try {
      if(response.code !== 200) {
        throw "Response: " + response.code;
      }
      translation = response.text[0].split('::');
      $($function).each(function() {
        $(this).text(translation.shift());
      });
    } catch(error) {
      console.error('Message returned by the server:', error);
    }
  },
  error: function(xhr, status, error) {
    console.error('Message returned by the server:', xhr.responseText);
  }
});

但是,我仍然需要弄清楚数据加载后如何打印。

1 个答案:

答案 0 :(得分:0)

好吧...我想我找到了想要的答案:

$('body').on('DOMNodeInserted', 'table', function() {
    $('td:visible').translate('es', 'en');
});

似乎工作正常。