@Kashmir2606

Как правильно сгенерировать HTML с текстом из json?

Есть функция которая через ajax достает текст из json и вставляет его в какой то обьект
$.fn.setLanguage = function(options){

        options = $.extend({
            language: 'ru',
            text: this.attr('data-text')
        }, options);

        var make = function(){
            var el = $(this);
            $.ajax({
                url : options.language +'.json',
                dataType: 'json',
                success:function(data) {
                    el.html(data[options.text]);
                }
            });
        };

        return this.each(make);
    };

Сама вставка:
var btn = $('<button type="button"></button>');
    btn.setLanguage({text:'login_error'});
    $('body').append(btn);

Но так неудобно, так как в той же кнопке могут быть еще какие то элементи и неизвестно куда вставлять текст.
Решил делать как то так:
$.getText = function(){
        var result;
        $.ajax({
            url :  'text.json',
            async: false,
            dataType: 'json',
            success:function(data) {
                result = data;
            }
        });
        return result
    };

var btn = $('<button type="button">'+ $.getTextFromJson('login_error') +'</button>');

Но тут все делается через синхронный запрос что не очень хорошо.
Может кто то делал подобное, поделитесь решением.
  • Вопрос задан
  • 352 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Я бы реализовал что-то вроде этого.
$.fn.setLanguage = function (options) {
    options = $.extend({
        language: 'ru',
        text: this.attr('data-text')
    }, options);

    var make = function () {
        var el = $(this);
        $.ajax({
            url: options.language + '.json',
            dataType: 'json',
            success: function (data) {
                var html = data[options.text];

                if ($.isFunction(options.callback)) {
                    options.callback(html);
                } else {
                    el.html(html);
                }
            }
        });
    };

    return this.each(make);
};

var wrapper = $('<div><i>Blah</i> <span>replaced</span> <b>Blah</b></div>');

wrapper.setLanguage({
    text: 'login_error',
    callback: $.proxy(function (html) {
        $(this).find('span').html(html);
    }, wrapper),
});

$('body').append(wrapper);

А еще лучше, конечно, сделать свое событие и слушать его.

Ну а вообще можно и не делать ajax-запрос делать. Проще получить объект переводов при старте страницы один раз и работать дальше с ним. Тогда и проблемы асинхронности не станет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы