javascript - 如何修改此脚本以根据 ID 使用不同的替换数组?

标签 javascript jquery

我有下面这个脚本。我想要做的是修改它,以便它根据 document.getElementById('something') 的内容使用一组不同的替换值。

因此(“标题”)将使用与(“正文”)等不同的替换字符集。

提前致谢

function DeGlyph(element) {
// List of replacement rules. 
     replacements= [
        //Single Quote Characters
        ['\u0027', '\''],
        ['\u2018', '\''],
        ['\u2019', '\''],
        ['\u201A', '\''],
        ['\u201B', '\''],
        //Double Quote Characters
        ['\u0022', '"'],
        ['\u201C', '"'],
        ['\u201D', '"'],
        ['\u201E', '"'],
        ['\u201F', '"'],
        ['\u301D', '"'],
        ['\u301E', '"'],
        ['\u301F', '"'],
        //Other Characters      
        ['\u00BC', '1/4'],
        ['\u00BD', '1/2'],
        ['\u00BE', '3/4'],
        ['\u2122', '<sup>TM</sup>'],        
        ['\u2013', '-'],
        ['\u2014', '&mdash;'],
        ['\u00A9', '&copy;'],
        ['\u00AE', '&reg;']         


    ];


// Only attempt to use replacer behaviour if we can retain the cursor
// position. Setting value by default moves the cursor to the end of the
// input, which is too irritating.
//
    if (getInputSelection(element)!==null) {
        element.onkeyup= function() {
            value= element.value;
            for (var i= 0; i<replacements.length; i++) {
                value= value.split(replacements[i][0]).join(replacements[i][1]);
            }
            if (value!=element.value) {
                var s= getInputSelection(element);
                element.value= value;
                setInputSelection(element, s);
            }
        };
    }
}

// Cross-browser (as much as possible anyway) cursor positioning
//
function getInputSelection(element) {
    if (element.selectionStart!==window.undefined) {
        return [element.selectionStart, element.selectionEnd];
    } else if (document.selection) {
        var BIG= 1000000;
        var range= document.selection.createRange();
        if (range.moveStart===window.undefined)
            return [0, 0];
        var start= -range.moveStart('character', -BIG);
        var end= -range.moveEnd('character', -BIG);
        return [start-1, end-1];
    } else return null;
}
function setInputSelection(element, s) {
    if (element.selectionStart!==window.undefined) {
        element.selectionStart= s[0];
        element.selectionEnd= s[1];
    } else if (document.selection) {
        var range= element.createTextRange();
        range.collapse(true);
        range.moveEnd('character', s[1]);
        range.moveStart('character', s[0]);
        range.select();
    }
}

new DeGlyph(document.getElementById('Headline')); 
new DeGlyph(document.getElementById('Body')); 

最佳答案

嗯,这很“有趣” - 就像克里斯说的那样,只需将函数替换为您想要使用的替换数组即可,而不是对其进行硬编码。

这是一个简单的问题 (a) 稍微改变查找表的格式 (b) 更改 DeGlyph 的函数 sig 以包含替换数组 (c) 添加一个函数来计算要传递给 DeGlyph 的变量。

尝试这个大小(是否需要选择输入中的文本,除了失去然后重新获得浏览器窗口的焦点来更新之外?我认为它不起作用,直到我选择原始文本然后执行 alt-在浏览器和另一个程序之间来回切换)

<!DOCTYPE html>
<html>
<head>
<script>

var mArray = 
    [
        {
                     forId : 'headline', 
            replacements : [
                                //Single Quote Characters
                                ['\u0027', '\''],
                                ['\u2018', '\''],
                                ['\u2019', '\''],
                                ['\u201A', '\''],
                                ['\u201B', '\'']
                            ]
        },


        { 
                     forId : 'body',
            replacements : [
                                ['\u0022', '"'],
                                ['\u201C', '"'],
                                ['\u201D', '"'],
                                ['\u201E', '"'],
                                ['\u201F', '"'],
                                ['\u301D', '"'],
                                ['\u301E', '"'],
                                ['\u301F', '"']
                            ]
        },

        { 
                     forId : 'mTest',
            replacements : [
                                ['1', 'one'],
                                ['2', 'two'],
                                ['3', 'three'],
                                ['4', 'four'],
                                ['5', 'five']
                            ]
        }
    ];




function mDeGlyph(idStr, mDataBank)
{
    var element = document.getElementById(idStr);
    if (element == null)
    {
        alert('no element with that id="'+idStr+'" found');
        return;
    }
    var i, n = mDataBank.length, replacements, found=false;
    for (i=0; i<n; i++)
    {
        if (mDataBank[i].forId == idStr)
        {
            replacements = mDataBank[i].replacements;
            found = true;
            break;
        }
    }
    if (found == true)
    {
        DeGlyph(element, replacements);
    }
    else
        alert("no apparent entry for that id-string");
}


function DeGlyph(element, replacements) 
{
// Only attempt to use replacer behaviour if we can retain the cursor
// position. Setting value by default moves the cursor to the end of the
// input, which is too irritating.
//
    if (getInputSelection(element)!==null) {
        element.onkeyup= function() {
            value= element.value;
            for (var i= 0; i<replacements.length; i++) {
                value= value.split(replacements[i][0]).join(replacements[i][1]);
            }
            if (value!=element.value) {
                var s= getInputSelection(element);
                element.value= value;
                setInputSelection(element, s);
            }
        };
    }
}

// Cross-browser (as much as possible anyway) cursor positioning
//
function getInputSelection(element) {
    if (element.selectionStart!==window.undefined) {
        return [element.selectionStart, element.selectionEnd];
    } else if (document.selection) {
        var BIG= 1000000;
        var range= document.selection.createRange();
        if (range.moveStart===window.undefined)
            return [0, 0];
        var start= -range.moveStart('character', -BIG);
        var end= -range.moveEnd('character', -BIG);
        return [start-1, end-1];
    } else return null;
}
function setInputSelection(element, s) {
    if (element.selectionStart!==window.undefined) {
        element.selectionStart= s[0];
        element.selectionEnd= s[1];
    } else if (document.selection) {
        var range= element.createTextRange();
        range.collapse(true);
        range.moveEnd('character', s[1]);
        range.moveStart('character', s[0]);
        range.select();
    }
}

// just displays the list of repoklacements that we have for assorted ids.
function mInit()
{

//  mDeGlyph('Headline');
//  mDeGlyph('Body');
    mDeGlyph('mTest', mArray);
}


</script>
<style>

</style>
</head>
<body onload='mInit();'>
    <input id='mTest' value='1 3 5' />
</body>
</html>

关于javascript - 如何修改此脚本以根据 ID 使用不同的替换数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847718/

相关文章:

javascript - 在新选项卡中打开缩略图

javascript - 当从同一个文件请求时,导出同一目录下的两个模块不起作用

javascript - 如何摆脱Javascript字符串中动态指定位置后的所有字符

JavaScript 范围

Jquery SQL 数组 WordPress

javascript - 标题大小写 JavaScript

javascript - 在 laravel 5.5 中通过 Javascript 获取总值(value)

jQuery - 使 .one 在类的任何一个元素上运行,而不是在每个元素上运行一次?

javascript - 如何在准备好时隐藏动态创建的 div?

jquery - 如何在不刷新整个页面的情况下提交表单