Как получить доступ к элементам управления из консоли

Я попытался выполнить следующую команду из консоли.

var subject = Xrm.Page.ui.controls.get("subject");

Именно такой синтаксис я использую в веб-ресурсе, который подключаю к CRM. Однако я получил только сообщение об ошибке, в котором говорилось, что «невозможно получить свойство« элементы управления »неопределенной или нулевой ссылки».

Я понимаю сообщение. То, что я хочу знать, двояко.

  1. Какой синтаксис будет работать из консоли (F12) для обращения к материалам на экране?
  2. Почему это не работает так, как я? Откуда взялся ui?

Я проверил, что могу ссылаться как на Xrm, так и на Crm.Page, но, по-видимому, ui имеет значение null (это в списке, когда я распечатываю содержимое Page, но устанавливаю значение null).


person Community    schedule 05.01.2013    source источник
comment
Код вашей команды заключен в функцию JS? Потому что иначе Xrm.Page.ui всегда будет интерпретироваться как нуль или не объект, как в вашем случае.   -  person amartine    schedule 06.01.2013
comment
Не могли бы вы объяснить, почему это так? Xrm — это переменная, доступная из консоли. Почему перенос вызова в функцию имеет значение? Спасибо!   -  person Ryan    schedule 12.11.2014
comment
@ Райан Я считаю, что он ошибся или неправильно понял вопрос. В DOM есть целая куча Xrm и Xrm.Page. Но тот, который нацелен на то, что он видит, доступен путем добавления frames[0] перед ним (при попытке из консоли, а не из веб-ресурса). Раздражение более сильной степени...   -  person Konrad Viltersten    schedule 13.11.2014
comment
Это чрезвычайно полезно! Большое спасибо. Я не понимаю, зачем нужны кадры [0] или почему это помогает.   -  person Ryan    schedule 14.11.2014
comment
Я не совсем уверен, но это может быть связано с тем, что приложение запускается в одном из этих фреймов, хотя никто этого не видит. Я думаю, вы могли бы попытаться зарегистрировать две разные организации, получить к ним доступ в одном и том же браузере, в одном окне или, может быть, в разных браузерах или что-то еще, и проверить, могут ли они получить frames[0], frames[1] и т. д. Когда CRM взаимодействует со своими собственными элементами управления, она знает, какой это экземпляр, и не может получить доступ к другой организации. Но когда окно консоли делает вызов, ссылка становится неоднозначной. Может быть. Иди и проверь - вернись к нам и расскажи. :)   -  person Konrad Viltersten    schedule 14.11.2014


Ответы (5)


В дополнение к тому, что сказал @Daryl, я могу добавить, что использую другой синтаксис. У меня почему-то он тоже не работает. Возможно дело в другой версии браузера или еще в чем. Вместо этого попробуйте выполнить это, если вы все еще не можете заставить его работать (хотя я должен признать, что его короче = лучше).

Xrm.Page.getAttribute("lastname").getValue();

Части lastname протестированы минуту назад при создании экземпляра объекта Contact. Я просто поставил точку останова внутри скрипта, который выполняется onchange, и в то время как точка останова была нарушена, я ввел указанную выше команду в консоль.

Если ни один из подходов вам не подходит, у вас какая-то странная проблема с CRM или браузером.

person Konrad Viltersten    schedule 09.01.2013

Я знаю, что это довольно старый поток, но если вы все еще получаете сообщение об ошибке «объект не поддерживает свойство...» при выполнении команды из консоли, IE F12; попробуйте вызвать его из фрейма, т.е.

frames[0].Xrm.Page.getAttribute("controlId").getValue();

В CRM 2013 немного по другому

frames[1].Xrm.Page
person meh    schedule 28.05.2013
comment
Вы ошибаетесь. Я сейчас сижу с CRM 2013, и это все еще frames[0]. Тем не менее, вы можете прочитать комментарий, который я сделал выше. Может быть, это то, что происходит на вашем компьютере? Было бы круто узнать хоть раз. - person Konrad Viltersten; 14.11.2014
comment
@lazarogonzales На самом деле, я должен добавить, что, возможно, я тоже частично ошибался. Кажется, есть разница между частью frames[index] между 2011 и 2013 годами, а также между локальным и онлайновым (и я бы не задохнулся, если бы разница варьируется до/после обновлений, накопительных пакетов и подъемов до 2015 г.). Хороший намек! - person Konrad Viltersten; 28.11.2014
comment
у меня framework[0] работает с CRM 2015 Update 0.1 локально, Chrome 46.0.2490.80 - person Tim Partridge; 06.11.2015
comment
Frames[0] это ДЕНЬГИ! Раньше я пытался отлаживать какой-то случайный JS-файл на странице. Было всегда трудно найти то, что работало. Это позволяет ввести его прямо в консоль. - person AlbatrossCafe; 18.11.2016

Довольно сложно обнаружить кадры в разных браузерах, поэтому этот небольшой javascript может вам помочь:

for(var i=0;i<5;i++) //loop through 0 to 4
    if(frames[i].Xrm.Page.ui != undefined) //check if undefined    
    {
        Xrm = frames[i].Xrm;  //assign Xrm
        console.info("~: Xrm updated with frame " + i + " :~"); //show info
        break; //breakout the loop
    }

Что он делает?

Что он в основном делает, так это перебирает 0-5, чтобы найти кадр, где Xrm.Page.ui не undefined, как только он его получает, он назначает его Xrm и разрывает цикл.

Как использовать?

Чтобы использовать его, просто скопируйте / вставьте и запустите в консоли браузера один раз за сеанс, а затем после того, как вы сможете запустить / протестировать все свои коды Xrm из консоли браузера.

person Vinod Srivastav    schedule 28.04.2017
comment
Вы можете рассмотреть немного другой синтаксис в условном выражении. Прежде всего, я бы спонтанно попытался избежать !=, если это возможно, и выбрал бы !==. Во-вторых, я считаю, что вы могли бы использовать только if(!frames[i].Xrm.Page.ui). В-третьих, я считаю, что это может быть частью условия цикла for, минимизирующего общее количество строк. :) - person Konrad Viltersten; 02.05.2017
comment
Да, изменения возможны, но if(!frames[i].Xrm.Page.ui) не будет работать и выдаст Невозможно получить свойство 'Xrm' неопределенной или нулевой ссылки< /б> - person Vinod Srivastav; 03.05.2017

Это работает для меня Xrm.Page.getControl("controlId"). Это всего лишь ярлык для того, что у вас уже есть... a-field/14073299#14073299">cant-disable-set-to-read-only-protect-grey-out-etc-a-field

person Daryl    schedule 06.01.2013
comment
Когда я запускаю код в веб-ресурсе, он находит мой компонент (называемый subject), но когда я запускаю его из консоли, я получаю сообщение Объект не поддерживает свойство или метод 'получить контроль'. Это похоже на то, что getControl не определен в моем Xrm.Page при доступе через консоль. Что я могу делать не так?! - person ; 07.01.2013
comment
@AndreasJohansson Какую версию IE вы используете? Вы пробовали другой компьютер? У меня никогда ничего не работало нормально при вызове непосредственно из CRM, а не при попытке вызвать его вручную из командной строки... - person Daryl; 07.01.2013
comment
Я пробовал IE10 на Win8 и IE8 на Windows Server. Та же проблема на обоих. Вы говорите, что можете, например. нажмите «Создать» и начните создавать новый Контакт, а в середине процесса вы можете нажать F12 и получить доступ к содержимому полей с помощью Xrm.Page.getControl("owner").getvalue()?! - person ; 08.01.2013
comment
Пока я нажал кнопку «Начать отладку», да. - person Daryl; 08.01.2013
comment
И под Начать отладку вы имеете в виду ‹kbd›F12‹/kbd›, верно? Или я что-то упускаю и не следую правильному подходу? - person ; 08.01.2013
comment
Вам нужно будет нажать F12, чтобы вызвать инструменты разработчика, затем F5, чтобы фактически запустить отладчик javascript (или щелкнуть тег скрипта, затем кнопку «Начать отладку») - person Daryl; 08.01.2013
comment
@AndreasJohansson К сожалению, тег kbd не работает в комментариях. И +1 Дэрилу за упорно-настойчивое объяснение. - person Konrad Viltersten; 09.01.2013

Причина, по которой некоторым людям нужна эта информация, заключается в доступе к их собственному коду. Если вам нужно получить доступ к вашим собственным методам из консоли, в 2011 году любые глобальные методы (или пространства имен) в вашем javascript также были в форме [0]. Очевидно, что это плохая идея, только с точки зрения именования. В формах v6+ любые глобальные объекты или функции находятся в объекте с именем customScriptsFrame внутри фреймов [0] (или, предположительно, в любом фрейме, в котором находится Xrm).

frames[0].customScriptsFrame.myFunctionName();

person Michael Blackburn    schedule 05.02.2018