Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:
Предположим, что у вас есть класс с именем Student.
public class Student
{
private string FirstName;
private string LastName;
public string GetFullName()
{
return FirstName + LastName;
}
}
Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.
public class StudentInfo
{
public string GetStudentName()
{
Student s;
string fullname = s.GetFullName();
return fullname;
}
}
Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.
Вы не можете сделать это во всех браузерах, предположительно IE делает , но Mozilla и Opera этого не делают.
Когда вы составляете сообщение в GMail, функция «прикреплять файлы» реализована одним способом для IE и любого браузера, который поддерживает это, а затем реализовал другой способ для Firefox и тех браузеров, которые этого не делают.
Я не знаю, почему вы не можете этого сделать, но одна вещь, которая является угрозой безопасности и которую вы не можете делать в любом браузере, программно задает имя файла в элементе HTML File.
Это чистое решение JavaScript для этой проблемы. Хорошо работает во всех браузерах
<script>
function upload_image_init(){
var elem = document.getElementById('file');
if(elem && document.createEvent) {
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, false);
elem.dispatchEvent(evt);
}
}
</script>
Вы можете стрелять по клику () в любом браузере, но некоторым браузерам необходимо, чтобы элемент был видимым и сфокусированным. Вот пример jQuery:
$('#input_element').show();
$('#input_element').focus();
$('#input_element').click();
$('#input_element').hide();
Он работает со скровом перед click()
, но я не знаю, работает ли он, не вызывая метод show. Никогда не пробовал это в Opera, я тестировал на IE / FF / Safari / Chrome, и он работает. Надеюсь, это поможет.
$(...).show().focus().click().hide();
:)
– pimvdb
31 July 2011 в 13:22
JS Fiddle: http://jsfiddle.net/eyedean/1bw357kw/
popFileSelector = function() {
var el = document.getElementById("fileElem");
if (el) {
el.click();
}
};
window.popRightAway = function() {
document.getElementById('log').innerHTML += 'I am right away!<br />';
popFileSelector();
};
window.popWithDelay = function() {
document.getElementById('log').innerHTML += 'I am gonna delay!<br />';
window.setTimeout(function() {
document.getElementById('log').innerHTML += 'I was delayed!<br />';
popFileSelector();
}, 1000);
};
<body>
<form>
<input type="file" id="fileElem" multiple accept="image/*" style="display:none" onchange="handleFiles(this.files)" />
</form>
<a onclick="popRightAway()" href="#">Pop Now</a>
<br />
<a onclick="popWithDelay()" href="#">Pop With 1 Second Delay</a>
<div id="log">Log: <br /></div>
</body>
Я искал решение на весь этот день. И вот те выводы, которые я сделал:
Надеюсь, это поможет! :)
<div style="display: block; width: 100px; height: 20px; overflow: hidden;">
<button style="width: 110px; height: 30px; position: relative; top: -5px; left: -5px;"><a href="javascript: void(0)">Upload File</a></button>
<input type="file" id="upload_input" name="upload" style="font-size: 50px; width: 120px; opacity: 0; filter:alpha(opacity=0); position: relative; top: -40px;; left: -20px" />
</div>
Вы можете использовать
<button id="file">select file</button>
<input type="file" name="file" id="file_input" style="display:none;">
<script>
$('#file').click(function() {
$('#file_input').focus().trigger('click');
});
</script>
$(document).one('mousemove', function() { $(element).trigger('click') } );
Работала для меня, когда я сталкивался с подобной проблемой, это обычный eRube Goldberg.
Есть способы перенаправления событий в элемент управления, но не ожидайте, что вы сможете легко запускать события в управление огнем самостоятельно, поскольку браузеры будут пытаться заблокировать это (хорошие) соображения безопасности.
Если вам нужно только открыть диалоговое окно файла, когда пользователь нажмет что-нибудь, скажем, потому что вам нужны более удобные кнопки для загрузки файлов, то вы можете взглянуть на , что Шон Инман пришел с .
Мне удалось добиться запуска клавиатуры с творческим переключением фокуса внутри и вне контроля между keydown, keypress & amp; события для создания ключей. YMMV.
. Мой искренний совет - оставить это в покое, потому что это мир несовместимости с браузером. Незначительные обновления браузера могут также блокировать трюки без предупреждения, и вам, возможно, придется повторно изобретать хаки, чтобы он работал.
просто используйте тег метки, таким образом вы можете скрыть ввод и заставить его работать через связанную метку https://developer.mozilla.org/fr/docs/Web/HTML/Element/Label
Вы можете сделать это в соответствии с ответом из диалогового окна «Открыть файл» на & lt; a & gt; tag
<input type="file" id="upload" name="upload" style="visibility: hidden; width: 1px; height: 1px" multiple />
<a href="" onclick="document.getElementById('upload').click(); return false">Upload</a>
Вот решение, которое работает для меня: CSS:
#uploadtruefield {
left: 225px;
opacity: 0;
position: absolute;
right: 0;
top: 266px;
opacity:0;
-moz-opacity:0;
filter:alpha(opacity:0);
width: 270px;
z-index: 2;
}
.uploadmask {
background:url(../img/browse.gif) no-repeat 100% 50%;
}
#uploadmaskfield{
width:132px;
}
HTML с «маленькой» помощью JQuery:
<div class="uploadmask">
<input id="uploadmaskfield" type="text" name="uploadmaskfield">
</div>
<input id="uploadtruefield" type="file" onchange="$('#uploadmaskfield').val(this.value)" >
Просто убедитесь, что maskfied is полностью покрыто истинным полем загрузки.
ЭТО ВОЗМОЖНО: под FF4 +, Opera?, Chrome: но:
inputElement.click()
следует вызывать из контекста действия пользователя! (не сценарий выполнения сценария) <input type="file" />
должен быть видимым (inputElement.style.display !== 'none'
) (вы можете скрыть его видимостью или чем-то другим, но не «отображаемым» свойством) onclick
вместо привязки к событию.
– jasonlfunk
25 November 2013 в 19:28
inputElement.click()
изнутри события keydown (ярлык для присоединения файла) работал, но вызов его в тайм-ауте или обратном вызове ajax был НЕ. Upvoted.
– brettjonesdev
14 April 2014 в 17:31
this
. : /
– brettjonesdev
14 April 2014 в 17:42
Я знаю, что это старо, и все эти решения - это хаки по предосторожностям безопасности браузера с реальной стоимостью.
Тем не менее, на сегодняшний день fileInput.click () работает в текущем Chrome (36.0.1985.125 m) и в настоящее время Firefox ESR (24.7.0), но не в текущем IE (11.0.9600.17207). Наложение поля файла с непрозрачностью 0 поверх кнопки работает, но я хотел, чтобы элемент ссылки был видимым триггером, а подчеркивание hover не совсем работает в любом браузере. Он мигает, а затем исчезает, вероятно, браузер думает, действительно ли применяется стиль зависания или нет.
Но я нашел решение, которое работает во всех этих браузерах. Я не буду утверждать, что тестировал каждую версию каждого браузера, или что я знаю, что он будет продолжать работать вечно, но, похоже, он отвечает моим потребностям.
Это просто: расположите поле ввода файла offcreen (position: absolute; top: -5000px), поместите вокруг него элемент метки и вызовите щелчок на метке вместо самого поля файла.
Обратите внимание, что ссылка должна быть написана сценарием для вызова метода щелчка метки, он не делает этого автоматически, например, когда вы нажимаете на текст внутри элемента метки. По-видимому, элемент ссылки фиксирует щелчок, и он не перескакивает на метку.
Обратите внимание, что это также не позволяет показать текущий выбранный файл, так как поле вне экрана. Я хотел немедленно отправить файл, когда был выбран файл, так что это не проблема для меня, но вам понадобится несколько иной подход, если ваша ситуация другая.
это не невозможно:
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent('click', true, true, window);
setTimeout(function(){ document.getElementById('input_field_id').dispatchEvent(evObj); },100);
Но как-то это работает, только если это функция, вызванная с помощью события click.
Итак, у вас может быть следующая настройка :
html:
<div onclick="openFileChooser()" class="some_fancy_stuff">Click here to open image chooser</div>
<input type="file" id="input_img">
JavaScript:
function openFileChooser() {
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent('click', true, true, window);
setTimeout(function()
{
document.getElementById('input_img').dispatchEvent(evObj);
},100);
}
createEvent()
и initMouseEvent()
устарели. Вы должны использовать CustomEvent()
сейчас ...
– Alexis Wilke
18 March 2016 в 02:02
Надеюсь, это помогает кому-то - я провел 2 часа, стукнувшись головой:
В IE8 или IE9, если вы вообще запускаете ввод файла с помощью javascript (поверьте, что я попробовал их все), он не позволит вам отправить форму с помощью javascript, она просто будет терпеть неудачу.
Отправка формы с помощью обычной кнопки отправки может работать, но вызов form.submit ();
Мне пришлось прибегнуть к наложению кнопки выбора файла с прозрачным файловым входом, который работает.
Мое решение для Safari с jQuery и jQuery-ui:
$("<input type='file' class='ui-helper-hidden-accessible' />").appendTo("body").focus().trigger('click');
Это сработало для меня:
<script>
function sel_file() {
$("input[name=userfile]").trigger('click');
}
</script>
<input type="file" name="userfile" id="userfile" />
<a href="javascript:sel_file();">Click</a>
Он работает:
Из соображений безопасности в Firefox и Opera вы не можете запускать щелчок по вводу файла, но вы можете имитировать с помощью MouseEvents:
<script>
click=function(element){
if(element!=null){
try {element.click();}
catch(e) {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click",true,true,window,0,0,0,0,0,false,false,false,false,0,null);
element.dispatchEvent(evt);
}
}
};
</script>
<input type="button" value="upload" onclick="click(document.getElementById('inputFile'));"><input type="file" id="inputFile" style="display:none">
createEvent()
и initMouseEvent()
теперь устарели.
– Alexis Wilke
18 March 2016 в 02:07
Этот код работает для меня. Это то, что вы пытаетесь сделать?
<input type="file" style="position:absolute;left:-999px;" id="fileinput" />
<button id="addfiles" >Add files</button>
<script language="javascript" type="text/javascript">
$("#addfiles").click(function(){
$("#fileinput").click();
});
</script>
Для тех, кто понимает, что вам нужно наложить невидимую форму по ссылке, но слишком ленивы писать, я написал ее для вас. Ну, для меня, но может также поделиться. Комментарии приветствуются.
HTML (где-то):
<a id="fileLink" href="javascript:fileBrowse();" onmouseover="fileMove();">File Browse</a>
HTML (где-то вас не волнует):
<div id="uploadForm" style="filter:alpha(opacity=0); opacity: 0.0; width: 300px; cursor: pointer;">
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
</form>
</div>
JavaScript:
function pageY(el) {
var ot = 0;
while (el && el.offsetParent != el) {
ot += el.offsetTop ? el.offsetTop : 0;
el = el.offsetParent;
}
return ot;
}
function pageX(el) {
var ol = 0;
while (el && el.offsetParent != el) {
ol += el.offsetLeft ? el.offsetLeft : 0;
el = el.offsetParent;
}
return ol;
}
function fileMove() {
if (navigator.appName == "Microsoft Internet Explorer") {
return; // Don't need to do this in IE.
}
var link = document.getElementById("fileLink");
var form = document.getElementById("uploadForm");
var x = pageX(link);
var y = pageY(link);
form.style.position = 'absolute';
form.style.left = x + 'px';
form.style.top = y + 'px';
}
function fileBrowse() {
// This works in IE only. Doesn't do jack in FF. :(
var browseField = document.getElementById("uploadForm").file;
browseField.click();
}
Теперь это возможно в Firefox 4 с предостережением, которое оно считает всплывающим окном и поэтому будет заблокировано всякий раз, когда появится всплывающее окно.
Я обнаружил, что если вход (файл) является внешней формой, тогда событие обжатия кликов вызывает диалог файла.
Эй, это решение работает. для загрузки мы должны использовать MSBLOB
$scope.getSingleInvoicePDF = function(invoiceNumberEntity) {
var fileName = invoiceNumberEntity + ".pdf";
var pdfDownload = document.createElement("a");
document.body.appendChild(pdfDownload);
AngularWebService.getFileWithSuffix("ezbillpdfget",invoiceNumberEntity,"pdf" ).then(function(returnedJSON) {
var fileBlob = new Blob([returnedJSON.data], {type: 'application/pdf'});
if (navigator.appVersion.toString().indexOf('.NET') > 0) { // for IE browser
window.navigator.msSaveBlob(fileBlob, fileName);
} else { // for other browsers
var fileURL = window.URL.createObjectURL(fileBlob);
pdfDownload.href = fileURL;
pdfDownload.download = fileName;
pdfDownload.click();
}
});
};
для AngularJS или даже для обычного javascript.
У меня был тэг <input type="button">
, скрытый от просмотра. Я сделал прикрепление события "onClick"
к любому видимому компоненту любого типа, такого как метка. Это было сделано с использованием либо инструментов разработчика Google Chrome, либо Firebug Mozilla Firefox, используя команду «edit HTML» правой кнопкой мыши. В этом случае укажите следующий скрипт или что-то подобное:
Если у вас есть JQuery:
$('#id_of_component').click();
, если нет:
document.getElementById('id_of_component').click();
Спасибо.
РАБОЧЕЕ РЕШЕНИЕ
blockquote>Позвольте мне добавить к этому старому сообщению, рабочее решение, которое я использовал для использования, работает, вероятно, на 80% или более все браузеры как новые, так и старые.
Решение сложное, но простое. Первый шаг - использовать CSS и отобразить тип входного файла с «подэлементами», которые показывают, поскольку он имеет непрозрачность 0. Следующий шаг - использовать JavaScript для обновления своей метки по мере необходимости.
HTML Идентификаторы просто вставляются, если вам нужен быстрый способ доступа к определенному элементу, однако классы являются обязательными, поскольку они относятся к CSS, который устанавливает весь этот процесс
blockquote><div class="file-input wrapper"> <input id="inpFile0" type="file" class="file-input control" /> <div class="file-input content"> <label id="inpFileOutput0" for="inpFileButton" class="file-input output">Click Here</label> <input id="inpFileButton0" type="button" class="file-input button" value="Select File" /> </div> </div>
CSS Имейте в виду, раскраски и стили шрифтов и т. д. являются вашими предпочтениями, если вы используете этот базовый CSS, вы всегда можете использовать after-
blockquote>.file-test-area { border: 1px solid; margin: .5em; padding: 1em; } .file-input { cursor: pointer !important; } .file-input * { cursor: pointer !important; display: inline-block; } .file-input.wrapper { display: inline-block; font-size: 14px; height: auto; overflow: hidden; position: relative; width: auto; } .file-input.control { -moz-opacity:0 ; filter:alpha(opacity: 0); opacity: 0; height: 100%; position: absolute; text-align: right; width: 100%; z-index: 2; } .file-input.content { position: relative; top: 0px; left: 0px; z-index: 1; } .file-input.output { background-color: #FFC; font-size: .8em; padding: .2em .2em .2em .4em; text-align: center; width: 10em; } .file-input.button { border: none; font-weight: bold; margin-left: .25em; padding: 0 .25em; }
JavaScript Чистое и истинное, однако, как показано на рис. , некоторые OLDER (удаленные) браузеры могут все еще иметь проблемы с ним (например, Netscrape 2!) [/ g4]
blockquote>var inp = document.getElementsByTagName('input'); for (var i=0;i<inp.length;i++) { if (inp[i].type != 'file') continue; inp[i].relatedElement = inp[i].parentNode.getElementsByTagName('label')[0]; inp[i].onchange /*= inp[i].onmouseout*/ = function () { this.relatedElement.innerHTML = this.value; }; };
Если вы хотите, чтобы метод click
работал в Chrome, Firefox и т. д., примените следующий стиль к вашему входному файлу. Это будет прекрасно скрыто, это похоже на display: none;
#fileInput {
visibility: hidden;
position: absolute;
top: 0;
left: -5000px;
}
. Это просто, я протестировал его!
Я изучал это некоторое время назад, потому что я хотел создать пользовательскую кнопку, которая откроет диалоговое окно файла и сразу начнет загрузку. Я просто заметил что-то, что могло бы сделать это возможным - firefox, кажется, открывает диалог, когда вы нажимаете в любом месте загрузки. Таким образом, это может сделать следующее:
Это теоретически, поскольку я уже использовал другой метод для решения проблемы, но это может сработать.
Попробуйте это решение: http://code.google.com/p/upload-at-click/
input
элементом видимым. Запуск методаclick
работает, в том числе в консоли, если элемент можно увидеть. – jwadsack 11 January 2012 в 00:32