замена JavaScript глобально массивом

Можно использовать массив для замены:

var array = {"from1":"to1", "from2":"to2"}

for (var val in array)
    text = text.replace(array, array[val]);

Но что, если необходимо заменить глобально, т.е. текст = text.replace (/from/g, "к");

Массив является довольно большим, таким образом, сценарий займет много места, если я запишу "текст = text.replace (...)" для каждой переменной.

Как можно использовать массив в этом случае? "/from1/g": "to1" не делает работы.

6
задан Qiao 14 January 2010 в 13:00
поделиться

2 ответа

Вы можете использовать крючок мыши низкого уровня. См. В это пример и проверьте на MESAGE WM_MOUSEMOVE в HoodCallback.

Вы также можете использовать класс IMessageFilter, чтобы поймать события мыши и вызвать событие, чтобы получить позицию (Примечание: это только получит позицию над окном, не снаружи этого):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace GlobalMouseEvents
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         GlobalMouseHandler gmh = new GlobalMouseHandler();
         gmh.TheMouseMoved += new MouseMovedEvent(gmh_TheMouseMoved);
         Application.AddMessageFilter(gmh);

         InitializeComponent();
      }

      void gmh_TheMouseMoved()
      {
         Point cur_pos = System.Windows.Forms.Cursor.Position;
         System.Console.WriteLine(cur_pos);
      }
   }

   public delegate void MouseMovedEvent();

   public class GlobalMouseHandler : IMessageFilter
   {
      private const int WM_MOUSEMOVE = 0x0200;

      public event MouseMovedEvent TheMouseMoved;

      #region IMessageFilter Members

      public bool PreFilterMessage(ref Message m)
      {
         if (m.Msg == WM_MOUSEMOVE)
         {
            if (TheMouseMoved != null)
            {
               TheMouseMoved();
            }
         }
         // Always allow message to continue to the next filter control
         return false;
      }

      #endregion
   }
}
-121--2387567-
var array = {"from1":"to1", "from2":"to2"}

for (var val in array)
    text = text.replace(new RegExp(val, "g"), array[val]);

Отредактируйте: Как Энди сказал, что вам, возможно, придется избежать специальных символов, используя такое сценарий , этот .

7
ответ дан 8 December 2019 в 18:37
поделиться

Вот идиома для простых, на основе строки, не требующей REGEXP в JS, поэтому вам не нужно беспокоиться о Regex-специальных символах:

for (var val in array)
    text= text.split(val).join(array[val]);

Примечание. Есть проблемы с использованием Объект как поиск общего назначения. Если кто-то обезьяна с объектом прототипом (плохая идея, но некоторые библиотеки делают это), вы можете получить больше Val S, чем вы хотели; Вы можете использовать Test Test , чтобы избежать этого. Кроме того, в IE, если ваша строка будет столкнуться с методом объекта , таких как TOSTRING , то есть загадочно скрывает его.

Для вашего примера здесь вы в порядке, но в качестве общего случая, когда строки могут быть чем угодно, вам нужно будет работать вокруг него, либо обработая ключевые строки, чтобы избежать столкновений, либо с использованием другой структуры данных Такие как массив [Найти, заменить] массивов.

2
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

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