Определите, является ли текущая реализация Javascript Rhino

Я использую javax.script в Java, и я хотел бы определить, является ли текущая реализация Javascript Rhino. Я делаю это, потому что мне нужен сценарий для правильной работы на веб-страницах, а также в Rhino.

Псевдокод Javascript:

function writeMessage(message) {
    if (implementation is Rhino) {
        print(message);
    }
    else if (script is running in a web browser) {
        document.write(message);
    }
}

person Anderson Green    schedule 05.08.2012    source источник
comment
Почему бы вам не проверить это с помощью Java-кода?   -  person Bergi    schedule 05.08.2012
comment
Я пытаюсь написать скрипт, который будет работать как на веб-страницах, так и в Rhino.   -  person Anderson Green    schedule 05.08.2012
comment
Итак, почему это не сработает в обоих? Если есть разница, вы можете просто использовать обнаружение признаков!   -  person Bergi    schedule 05.08.2012
comment
@Bergi Можно ли проверить это с помощью Javascript вместо кода Java? Я думаю, было бы громоздко заменять каждое вхождение document.write(string) на print(string).   -  person Anderson Green    schedule 05.08.2012
comment
Да, обнаружение признаков — это то, что я пытаюсь здесь сделать.   -  person Anderson Green    schedule 05.08.2012


Ответы (2)


А, вот мы и получили это в вашем комментарии. Просто используйте функцию обнаружения:

var writeMessage = document && document.write
  ? document.write.bind(document)
  : print;

А затем используйте writeMessage(string) по всему сценарию. Это краткая форма

if (document && document.write)
    var writeMessage = function(message) { document.write(message); };
else
    var writeMessage = function(message) { print(message); };

что лучше, чем то, что вы предложили в вопросе, где обнаружение будет применяться каждый раз при вызове функции:

function writeMessage(message) {
    if (document && document.write) { // running in a web browser
        document.write(message);
    } else { // it will be Rhino
        print(message);
    }
}
person Bergi    schedule 05.08.2012
comment
Я не вижу объявления переменной pring. К чему это относится? - person Anderson Green; 05.08.2012
comment
@AndersonGreen это опечатка; он имел в виду print. - person obataku; 05.08.2012
comment
Так что же на самом деле делает этот код? Синтаксис мне несколько неясен. Можно ли его переписать без оператора вопросительного знака? - person Anderson Green; 05.08.2012
comment
Объяснение синтаксиса тернарного оператора в Javascript (который в данном случае трудно понять): stackoverflow.com/questions/1771786/question-mark-in-javascript - person Anderson Green; 05.08.2012
comment
@AndersonGreen Если document определено и не равно нулю, а document.write также равно, то он устанавливает переменную writeMessage в ссылку на связанную функцию, а именно document.write; в противном случае он устанавливает writeMessage в ссылку на print. По сути, если вы можете использовать document.write, он использует это (например, это будет работать в большинстве браузеров); если нет, то предполагается, что вы используете Rhino, и вместо этого выбирает print. - person obataku; 05.08.2012
comment
Так можно ли так писать? если (документ && документ. запись) { документ. запись. привязка (документ); } иначе{печать;} - person Anderson Green; 05.08.2012

Если его нужно запускать только в веб-браузере или поверх Rhino, то, конечно, они взаимоисключающие; то есть, если скрипт не запускается в браузере, то он запускается через Rhino.

person obataku    schedule 05.08.2012
comment
Это не или-или. Я планирую использовать скрипт в Rhino, а также на некоторых веб-страницах. Я бы использовал console.log, если бы скрипт работал в Chrome, и писал бы, если бы скрипт работал в Rhino. - person Anderson Green; 05.08.2012
comment
Что такое альтернативный вариант? - person obataku; 05.08.2012
comment
Он имел в виду: есть только два варианта запуска, и когда скрипт выполняется, он запускается ровно в одном из них. - person Bergi; 05.08.2012
comment
@ Берги, так разве они не должны быть взаимоисключающими? Прости меня, если я ошибаюсь. - person obataku; 05.08.2012
comment
@veer В этом случае к чему они относятся? - person Anderson Green; 05.08.2012
comment
@AndersonGreen «они» относятся к двум различным способам запуска этого кода, а именно через веб-браузер и через Rhino. Моя точка зрения заключалась в том, что вам не нужен способ проверить, работаете ли вы через Rhino, только то, что вы выполняете через веб-браузер, поскольку параметры являются эксклюзивными. - person obataku; 05.08.2012
comment
@veer Почему варианты должны быть взаимоисключающими? Можно написать сценарий, который будет правильно работать как в Rhino, так и в браузере (используя обнаружение функций). - person Anderson Green; 05.08.2012
comment
@AndersonGreen Я не думаю, что вы понимаете, что такое взаимное исключение. Я хотел сказать, что сценарий в любой момент выполнения либо запускается через Rhino, ИЛИ через веб-браузер. Таким образом, вам нужно только проверить одно, чтобы вывести другое — если оно работает в браузере, это не через Rhino; наоборот, если не в браузере, то точно через Rhino. Это было моей точкой зрения. - person obataku; 05.08.2012
comment
Да, но я собираюсь использовать скрипт как на веб-странице, так и в Rhino (но, конечно, не в обоих одновременно). Я просто хочу, чтобы он правильно работал в более чем одной реализации javascript. - person Anderson Green; 05.08.2012
comment
@AndersonGreen Взаимоисключающие события -- я прекрасно понимаю, что вы собираетесь использовать его в оба, поэтому я предложил вам только проверить, запускается ли скрипт в браузере, а затем вы можете сделать вывод, запускается ли он через Rhino, поскольку события дополнительный. - person obataku; 05.08.2012