BB Code Parser (в фазе форматирования) с jQuery, заклинившим из-за перепутанных циклов, скорее всего - PullRequest
0 голосов
/ 19 апреля 2010

Приветствую всех, Я делаю BB Code Parser, но я застрял на фронте JavaScript. Я использую jQuery и библиотеку вставок для того, чтобы отметить выбор в текстовом поле. Когда кто-то выбирает фрагмент текста, появляется div с параметрами форматирования.

У меня есть две проблемы.
Выпуск 1. Как я могу сделать это для нескольких текстовых полей? Я рисую пробел, так как в настоящее время он будет правильно определять текстовое поле, пока оно не введет

$("#BBtoolBox a").mousedown(function() { }

петля. После ввода он начнет перечислять одно поле за другим случайным образом в моих глазах.

!!! ОСНОВНОЙ выпуск 2. Я полагаю, что это главная причина и для выпуск 1 . Когда я нажимаю параметр форматирования, он будет работать с первым действием, но не с последующим. Он продолжает дублировать переменную parsed . (если я оставлю только одно поле, оно никогда не будет напечатано во втором)

Выпуск 3 Если вы обнаружите в коде что-то особенно уродливое, расскажите, пожалуйста, как себя улучшить.

Я ценю любую помощь, которую могу получить. Заранее спасибо

$(document).ready(function() {
    BBCP();
});

function BBCP(el) {
    if(!el) { el = "textarea"; }
    // Stores the cursor position of selection start

    $(el).mousedown(function(e) {
    coordX = e.pageX;
    coordY = e.pageY;

    // Event of selection finish by using keyboard
    }).keyup(function() {
        BBtoolBox(this, coordX, coordY);

    // Event of selection finish by using mouse
    }).mouseup(function() {
        BBtoolBox(this, coordX, coordY);

    // Event of field unfocus
    }).blur(function() {
        $("#BBtoolBox").hide();

    });

}

function BBtoolBox(el, coordX, coordY) {
    // Variable containing the selected text by Caret
    selection = $(el).caret().text;
    // Ignore the request if no text is selected
    if(selection.length == 0) {
        $("#BBtoolBox").hide();
        return;
    }
    // Print the toolbox
    if(!document.getElementById("BBtoolBox")) {
        $(el).before("<div id=\"BBtoolBox\" style=\"left: "+ ( coordX + 5 ) +"px; top: "+ ( coordY - 30 ) +"px;\"></div>");
        // List of actions
        $("#BBtoolBox").append("<a href=\"#\" onclick=\"return false\"><img src=\"./icons/text_bold.png\" alt=\"B\" title=\"Bold\" /></a>");
        $("#BBtoolBox").append("<a href=\"#\" onclick=\"return false\"><img src=\"./icons/text_italic.png\" alt=\"I\" title=\"Italic\" /></a>");

    } else {
        $("#BBtoolBox").css({'left': (coordX + 3) +'px', 'top': (coordY - 30) +'px'}).show();
    }

    // Parse the text according to the action requsted
    $("#BBtoolBox a").mousedown(function() {
        switch($(this).children(":first").attr("alt"))
        {
            case "B": // bold
                parsed = "[b]"+ selection +"[/b]";
                break;
            case "I": // italic
                parsed = "[i]"+ selection +"[/i]";
                break;
        }

        // Changes the field value by replacing the selection with the variable parsed
        $(el).val($(el).caret().replace(parsed));
        $("#BBtoolBox").hide();
        return false;
    });
}

1 Ответ

0 голосов
/ 19 апреля 2010

Эта строка: $("#BBtoolBox a").mousedown(function() присоединяет функцию к ссылкам. Однако эта строка запускается несколько раз , и каждый раз, когда она запускается, она присоединяет к ссылкам другую функцию, оставляя вам дублированный текст.

Оптимальным решением является использование плагина, например (первый, который я нашел): http://urlvars.com/code/example/19/using-jquery-bbcode-editor (демо)

...