Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Подмена js на странице до запуска скрипта (https://javascript.ru/forum/css-html/71501-podmena-js-na-stranice-do-zapuska-skripta.html)

AlStorm 23.11.2017 16:44

Подмена js на странице до запуска скрипта
 
Всем привет! Может быть нубский вопрос, но...

В общем, есть сайт. На его странице подгружается внешний js, где есть интересная мне процедура. Допустим, такая:

function(locale) {
        var localeSplit = locale.split(":");
        language = localeSplit.length > 1 ? localeSplit[1] : 'English';
        var key = "runtime:" + language
        if (language != "English" && language) {
            translationService.getTranslationData(locale).success(function(translations) {
                if (localStorage.getItem(key)) {
                    var json = JSON.parse(localStorage.getItem(key))
                    translations = _.extend(translations, json)
                }
                localStorage.setItem(key, JSON.stringify(translations))
                gettextCatalog.setStrings(language, translations);
                gettextCatalog.setCurrentLanguage(language);
            })
        }
    }


Все, что мне нужно, это в переменную locale вписать значение "en-GB:Russian" в начале функции. Сделать так, чтобы скрипт отработал уже после моего изменения. Как мне это сделать? В дебаггере проверил - все работает, но как изменить функцию на постоянной основе? Может быть, с помощью расширения или ..?

ruslan_mart 23.11.2017 18:22

Перед скриптом:

var _originSplit = ''.split;
String.prototype.split = Array.bind(null, 'en-GB', 'Russian');


После скрипта:
String.prototype.split = _originSplit;
_originSplit = null;



Но если где-то внутри используется split, то может всё сломаться.

AlStorm 23.11.2017 22:53

Цитата:

Сообщение от ruslan_mart (Сообщение 471112)
Перед скриптом:

var _originSplit = ''.split;
String.prototype.split = Array.bind(null, 'en-GB', 'Russian');


После скрипта:
String.prototype.split = _originSplit;
_originSplit = null;



Но если где-то внутри используется split, то может всё сломаться.

Наверное, не так объяснил... Сайт - не мой. Внести изменения в его код напрямую не могу. Но хочу. Вопрос: как внести изменения в этот код на стороне клиента? С помощью плагина, расширения браузера или еще как.

MallSerg 23.11.2017 23:36

Google =)

AlStorm 24.11.2017 10:32

Цитата:

Сообщение от MallSerg (Сообщение 471128)

А userscript точно можно запустить ДО запуска встроенного скрипта на странице?

MallSerg 24.11.2017 10:51

Google ...

Стихотворение

Aetae 24.11.2017 16:59

Примерно так:
// ==UserScript==
// @name        Replace locale
// @include     http*!**/!*://site.com/*
// @grant       none
// @run-at      document-start
// ==/UserScript==
if(typeof unsafeWindow === 'undefined') unsafeWindow = window;
unsafeWindow.String.prototype.split = function(split){
  return function(separator){
    if(separator === ':' && this === 'English'){ //если разделитель ":" и строка нужная нам 
      unsafeWindow.String.prototype.split = split; // возвращаем на место стандартный метод
      return ['en-GB', 'Russian']; // отдаём нужные значения
    }
    return split.apply(this, arguments); // иначе отдаём результат стандартного метода
  }
}(unsafeWindow.String.prototype.split)


Часовой пояс GMT +3, время: 01:17.