1

我有以下代码。

    var oldBeforeUnload = window.onbeforeunload;
    window.onbeforeunload = function()
  {
if(modifiedItems && modifiedItems != null)
{
    var modifiedItemsArr = modifiedItems.split(",");
    if(window.showModalDialog)
    {
        window.returnValue = modifiedItemsArr;
    }
    else
    {
        if (window.opener && window.opener.setFieldValue)
        {
            window.opener.setFieldValue(modifiedItemsArr);
        }
     }
 }
   return oldBeforeUnload();
  };

当我在 IE 中运行 split 时,它会抛出一个

error : object doesnt support property or method split.

在 ff 中,它没有任何日志就退出了。

on alert(modifiedItems) //the output is Ljava.lang.object;@c14d9

任何人都可以告诉为什么拆分不起作用或者我的 modifiedItem 错误。

4

4 回答 4

0

使用这种跨浏览器方法将使一切正常。

该脚本可在以下网址下载:http: //blog.stevenlevithan.com/archives/cross-browser-split

它一直对我有用。

    /*!
     * Cross-Browser Split 1.1.1
     * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
     * Available under the MIT License
     * ECMAScript compliant, uniform cross-browser split method
     */

    /**
     * Splits a string into an array of strings using a regex or string separator. Matches of the
     * separator are not included in the result array. However, if `separator` is a regex that contains
     * capturing groups, backreferences are spliced into the result each time `separator` is matched.
     * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
     * cross-browser.
     * @param {String} str String to split.
     * @param {RegExp|String} separator Regex or string to use for separating the string.
     * @param {Number} [limit] Maximum number of items to include in the result array.
     * @returns {Array} Array of substrings.
     * @example
     *
     * // Basic use
     * split('a b c d', ' ');
     * // -> ['a', 'b', 'c', 'd']
     *
     * // With limit
     * split('a b c d', ' ', 2);
     * // -> ['a', 'b']
     *
     * // Backreferences in result array
     * split('..word1 word2..', /([a-z]+)(\d+)/i);
     * // -> ['..', 'word', '1', ' ', 'word', '2', '..']
     */
    var split;

    // Avoid running twice; that would break the `nativeSplit` reference
    split = split || function (undef) {

        var nativeSplit = String.prototype.split,
            compliantExecNpcg = /()??/.exec("")[1] === undef, // NPCG: nonparticipating capturing group
            self;

        self = function (str, separator, limit) {
            // If `separator` is not a regex, use `nativeSplit`
            if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
                return nativeSplit.call(str, separator, limit);
            }
            var output = [],
                flags = (separator.ignoreCase ? "i" : "") +
                        (separator.multiline  ? "m" : "") +
                        (separator.extended   ? "x" : "") + // Proposed for ES6
                        (separator.sticky     ? "y" : ""), // Firefox 3+
                lastLastIndex = 0,
                // Make `global` and avoid `lastIndex` issues by working with a copy
                separator = new RegExp(separator.source, flags + "g"),
                separator2, match, lastIndex, lastLength;
            str += ""; // Type-convert
            if (!compliantExecNpcg) {
                // Doesn't need flags gy, but they don't hurt
                separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
            }
            /* Values for `limit`, per the spec:
             * If undefined: 4294967295 // Math.pow(2, 32) - 1
             * If 0, Infinity, or NaN: 0
             * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
             * If negative number: 4294967296 - Math.floor(Math.abs(limit))
             * If other: Type-convert, then use the above rules
             */
            limit = limit === undef ?
                -1 >>> 0 : // Math.pow(2, 32) - 1
                limit >>> 0; // ToUint32(limit)
            while (match = separator.exec(str)) {
                // `separator.lastIndex` is not reliable cross-browser
                lastIndex = match.index + match[0].length;
                if (lastIndex > lastLastIndex) {
                    output.push(str.slice(lastLastIndex, match.index));
                    // Fix browsers whose `exec` methods don't consistently return `undefined` for
                    // nonparticipating capturing groups
                    if (!compliantExecNpcg && match.length > 1) {
                        match[0].replace(separator2, function () {
                            for (var i = 1; i < arguments.length - 2; i++) {
                                if (arguments[i] === undef) {
                                    match[i] = undef;
                                }
                            }
                        });
                    }
                    if (match.length > 1 && match.index < str.length) {
                        Array.prototype.push.apply(output, match.slice(1));
                    }
                    lastLength = match[0].length;
                    lastLastIndex = lastIndex;
                    if (output.length >= limit) {
                        break;
                    }
                }
                if (separator.lastIndex === match.index) {
                    separator.lastIndex++; // Avoid an infinite loop
                }
            }
            if (lastLastIndex === str.length) {
                if (lastLength || !separator.test("")) {
                    output.push("");
                }
            } else {
                output.push(str.slice(lastLastIndex));
            }
            return output.length > limit ? output.slice(0, limit) : output;
        };

        // For convenience
        String.prototype.split = function (separator, limit) {
            return self(this, separator, limit);
        };

        return self;

    }();
于 2014-09-10T09:44:38.773 回答
0

modifiedItems 必须是字符串才能使用拆分。

警报(修改项目的类型);

var oldBeforeUnload = window.onbeforeunload;
    window.onbeforeunload = function()
  {
if(modifiedItems && modifiedItems != null)
{
    alert(typeof modifiedItems); 
    var modifiedItemsArr = modifiedItems.split(",");

    if(window.showModalDialog)
    {
        window.returnValue = modifiedItemsArr;
    }
    else
    {
        if (window.opener && window.opener.setFieldValue)
        {
            window.opener.setFieldValue(modifiedItemsArr);
        }
     }
 }
   return oldBeforeUnload();
  };
于 2013-10-11T09:00:04.080 回答
0

Split 是一种可以在字符串上调用的方法。看起来好像您正在尝试拆分对象而不是字符串。下面是正确和错误的用法:
"a,s,d".split(",") // returns ['a','s','d']
{obj:true}.split(",") // will throw the error you are seeing becuase it is an object

要确认这一点,您可以使用以下命令:

console.log(typeof modifiedItems) // <- will output the vaiable type

modifiedItems 应该是一个无法拆分的对象,获取您尝试从修改后的项目中拆分出来的值。另一方面,您正在使用看起来不需要的窗口命名空间。查看下面的一些链接,以确定您是否真的应该使用 window 对象。

在 Window 对象上设置属性是否被认为是不好的做法?

为什么附加到窗口[编辑]

于 2013-10-11T09:02:49.130 回答
0

变量“modifiedItems”应该是拆分函数工作的字符串。在您的情况下,alert(modifiedItems) 应该提醒字符串值。我建议您检查“modifiedItems”。split() 是字符串对象中的一个函数。

于 2013-10-11T09:01:47.530 回答