Autor Zpráva
Kelghor
Profil *
Ahoj, řeším miniproblém, nemohu se dostat k jádru pudla a prostě nedaří se mi najít dobrý návod...

Co potřebuji? Pomoci JS vytvořit tlačítko, které vloží tag do TextArea a navíc kursor myši (nebo lépe řečeno kursor v textu.. taková ta blikací svislá čára, když něco píšete) se zobrazila mezi tagy.

Jako příklad jak bych chtě+l aby to fungobalo, kliknete si na B tady na foru při psaní zprávy.. přěsně tohle potřebuju aby mi to dělalo, v čem je fígl prosím?
Darker
Profil
Proč si to neprozkoumáš? Funkce která se spustí je insertTag("b");
Kelghor
Profil *
No, prozkoumávat se v cizím kódu je dost náročný, kór, když jsem doufla, že mi to někdo kdo to umí nějak jednoduše vysvětlí jaké finty se tam užívá...
Darker
Profil
Kelghor:
prozkoumávat se v cizím kódu je dost náročný
Vysvětlovat taky.

function insertTag(tag) {
    var parovy = tag != "hr";
    var startTag = "[" + tag + "]";
    var endTag = ("[/" + tag + "]").replace(/(\[\/(?:pre|font))[^\]]+(\])|\[\/hr\]/gi, "$1$2");
    var selectionType = tag.match(/^pre|hr|mod/i) ? "" : "word";
    var selectionTrim = tag.match(/^pre|hr|mod/i) ? /^\n+|\n+$/g : /^\s+|\s+$/g;
    var tac = getTextareaSelection({context: true, type: selectionType, trim: selectionTrim});
    var tagText = tac[1];
    if (tag.match(/^([bi]|del|edit|small|pre\w*)$/i)) {
        var opened = tac[0].lastIndexOf(startTag) > tac[0].lastIndexOf(endTag);
        var closed = (tac[2] + endTag).indexOf(endTag) < (tac[2] + startTag).indexOf(startTag);
        tagText = tagText.replace(new RegExp((startTag.replace(/pre\w*/, "pre\\w*") + ("|" + endTag)).replace(/\[/g, "\\$&"), "gi"), "");
        if (opened && closed) {
            var temp;
            temp = startTag;
            startTag = endTag;
            endTag = temp;
        } else if (opened) {
            if (!tag.match(/[bi]/)) {
                startTag = "";
            }
        } else if (closed) {
            endTag = "";
        }
    } else if (tag == "img") {
        tagtext = tagText.replace(/\[\/?([bi]|del|edit|small|pre[a-z]*|img(left|right)?|hr|mod|url(\=[^\]]+)?)\]/gi, "");
    }
    var text2insert = startTag + tagText + endTag;
    var cursor = tagText ? text2insert.length : startTag.length;
    insertText(text2insert, cursor);
}
function insertText(inserted, cursor) {
    try {
        if (inserted != null) {
            inserted = inserted.toString().replace(/\r\n?/g, "\n");
            if (typeof cursor == "undefined") {
                cursor = inserted.length;
            }
        }
        var textarea = document.forms.postMsg.elements.poslText;
        if (textarea.readOnly) {
            return;
        }
        var scrollTop = textarea.scrollTop;
        var scrollHeight = textarea.scrollHeight;
        textarea.focus();
        if (typeof textarea.selectionStart != "undefined") {
            var sel = [], st = textarea.value.substr(0, textarea.selectionStart).replace(/\r\n?/g, "\n");
            sel[0] = Math.max(st.length + (typeof cursor != "number" ? cursor[0] : cursor), 0);
            st += inserted != null ? inserted + textarea.value.substr(textarea.selectionEnd).replace(/\r\n?/g, "\n") : textarea.value.substr(textarea.selectionStart).replace(/\r\n?/g, "\n");
            sel[1] = Math.min(sel[0] + (typeof cursor != "number" ? cursor[1] : 0), st.length);
            if (window.opera) {
                for (var i = 0; i < 2; i++) {
                    var p = st.substr(0, sel[i]);
                    sel[i] += p.length - p.replace(/\n/g, "").length;
                }
            }
            if (inserted != null) {
                textarea.value = st;
            }
            textarea.selectionStart = sel[0];
            textarea.selectionEnd = sel[1];
        } else if (typeof document.selection != "undefined") {
            var range = document.selection.createRange();
            var start = 0, end = 0;
            if (inserted != null) {
                start = end = - inserted.length;
                range.text = inserted;
            } else {
                end = - range.text.replace(/\r\n?/g, "\n").length;
            }
            if (typeof cursor != "number") {
                range.moveStart("character", start + cursor[0]);
                range.moveEnd("character", end + cursor[0] + cursor[1]);
            } else {
                if (start + cursor) {
                    range.move("character", start + cursor);
                }
            }
            range.select();
        }
    } catch (exc) {
    }
    if (window.netscape) {
        textarea.scrollTop = scrollTop + (textarea.scrollHeight - scrollHeight);
    }
}
Chamurappi
Profil
Reaguji na Darkera:
To, co jsi zvýraznil, nestačí. Celá ta funkce je složitější, než potřebuje. Kdo ji nepochopí, neměl by si ji odtud vypůjčovat.


Reaguji na Kelghora:
Viz použití djpw.js.
Darker
Profil
Chamurappi:
To, co jsi zvýraznil, nestačí.
Zvýrazňovat ve dvě ráno znamená jistý neúspěch. Stejně jsem sem (záměrně) nenakopíroval všechno.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: